开发者社区> 问答> 正文

jfinal用config类启动工程无法用fastjson转换,而jetty:run就可以?报错

@JFinal 你好,想跟你请教个问题:

这个问题很怪, 我一直用maven的jetty:run来启动工程的, 今天想换成Config.java#main函数的这种启动方式

public static void main(String[] args) {
        JFinal.start("src/main/webapp",20001,"/lzqxl",5);
    }



我的BaseController中有一段renderJson的方法:

public void rendFastJson(Object object) {
        //这个filter将null变为""
        System.out.println(object);
        String json = JSON.toJSONString(object, new JsonValueFilter());
        this.renderJson(json);
    }



方法虽然很土,但是能实现将属性为null转换为"", 因此我的action中的要返回json的时候都是用的renderFastJson而不是jfinal官方的renderJson,我是这么用的

if (lawyer == null) {
   rendFastJson(JsonResult.build(ErrCode.USERNAME_AUTH_ERROR));
   return;
}



那么问题来了, 今天我心血来潮换下工程的启动方式, 就报错了:

java.lang.ClassCastException: com.app.common.web.json.JsonResult cannot be cast to com.app.common.web.json.JsonResult
	at com.alibaba.fastjson.serializer.ASMSerializer_1_JsonResult.writeNormal(Unknown Source)
	at com.alibaba.fastjson.serializer.ASMSerializer_1_JsonResult.write(Unknown Source)
	at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:266)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:562)
	at com.alibaba.fastjson.JSON.toJSONString(JSON.java:500)
	at com.app.common.web.BaseController.rendFastJson(BaseController.java:75)
	at com.app.sign.SignInController.auth(SignInController.java:81)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)



很诡异啊

展开
收起
爱吃鱼的程序员 2020-06-09 14:34:35 699 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

      注意看这句异常:com.app.common.web.json.JsonResultcannotbecasttocom.app.common.web.json.JsonResult,很明显,从字面上看是完全同一个类JsonResult,但本质上不是同一个,因为你的eclipse设置的输出路径并不是WEB-INF/classes,导致了tomcat或jetty启动的时候用的自己的类加载器加载了一次WEB-INF/classes下的类,而在别处对JsonResult引用时,另一个类加载器再加载了一次JsonResult,造成了看似相同的类型出现类型转换错误。改下eclipse的classes输出路径即可

      此外,定制json转换的行为,没必要这么麻烦,只需要扩展一下IJsonFactory,然后me.setJsonFactory(...)换成自己的JsonFactory实现即可彻底一次性地切换到自己喜欢的json实现

    回复 @JFinal:那我用你的方式启动的话,要改什么配置啊,我用的IDEA回复 @错觉:意思就是启动过程与运行过程使用了不同的类加载器啥意思?我用你文档里面的Config.java#main启动工程才有问题,用我maven配置的嵌入式jetty没问题的,用外部的tomcat服务器也没问题
    2020-06-09 14:34:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战 立即下载
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
杜万-Java reactive programming - Reactor 3 and Spring WebFlux 立即下载

相关实验场景

更多