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

错觉 发布于 2016/05/14 23:29
阅读 381
收藏 0

@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)



很诡异啊

加载中
0
JFinal
JFinal

    注意看这句异常:com.app.common.web.json.JsonResult cannot be cast to com.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
JFinal
JFinal
回复 @错觉 : 意思就是启动过程与运行过程使用了不同的类加载器
错觉
错觉
啥意思? 我用你文档里面的Config.java#main启动工程才有问题, 用我maven配置的嵌入式jetty没问题的, 用外部的tomcat服务器也没问题
返回顶部
顶部