当前位置:首页 > 开发 > 编程语言 > Spring > 正文

spring 3+ fastjson bug 记录

发表于: 2014-05-08   作者:诸葛不亮   来源:转载   浏览次数:
摘要: 场景描述:  使用fastjson的JSON.toJSONString(Domain)的时候,如果Domain中有字段是通过spring proxy出来的,在spring3以上版本会报错,spring3以下不受影响:代理代码如下:   ProxyFactory proxy = new ProxyFactory(Manager); prox

场景描述:

 使用fastjson的JSON.toJSONString(Domain)的时候,如果Domain中有字段是通过spring proxy出来的,在spring3以上版本会报错,spring3以下不受影响:代理代码如下:

 

        ProxyFactory proxy = new ProxyFactory(Manager);
        proxy.addAdvice(Interceptor);
        return (VO) proxy.getProxy();

   报错如下:

 

Caused by: com.alibaba.fastjson.JSONException: create asm serializer error, class interface org.springframework.aop.Advisor
        at com.alibaba.fastjson.serializer.SerializeConfig.createJavaBeanSerializer(SerializeConfig.java:88)
        at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:455)
        at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:423)
        at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:371)
        at Serializer_6.write1(Unknown Source)
        at Serializer_6.write(Unknown Source)
        at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:373)
        at Serializer_2.write1(Unknown Source)
        at Serializer_2.write(Unknown Source)
        at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:352)
        at com.alibaba.fastjson.JSON.toJSONString(JSON.java:378)
        at com.alibaba.fastjson.JSON.toJSONString(JSON.java:366)
      
Caused by: java.lang.NullPointerException
        at com.alibaba.fastjson.util.TypeUtils.isJSONTypeIgnore(TypeUtils.java:952)
        at com.alibaba.fastjson.util.TypeUtils.isJSONTypeIgnore(TypeUtils.java:963)
        at com.alibaba.fastjson.util.TypeUtils.computeGetters(TypeUtils.java:827)

 

原理:

spring3以后spring-CORE 里面包含了CGLIB,相关类由

net.sf.cglib.proxy.Factory
变为:
org.springframework.cglib.proxy.Factory

 

假设Domain里面的A这个对象,通过A.getInterface[] 可以看到

 

 spring 3: (java.lang.Class<T>[]) [interface org.springframework.aop.SpringProxy, interface org.springframework.aop.framework.Advised, interface org.springframework.cglib.proxy.Factory]
 spring 2: (java.lang.Class<T>[]) [interface org.springframework.aop.SpringProxy, interface org.springframework.aop.framework.Advised, interface net.sf.cglib.proxy.Factory]  

 

而在fastjsom:JSONSerializer的 472行(21版本)

 

       for (Class<?> item : clazz.getInterfaces()) {
                    if (item.getName().equals("net.sf.cglib.proxy.Factory")) {
                        isCglibProxy = true;
                        break;
                    } else if (item.getName().equals("javassist.util.proxy.ProxyObject")) {
                        isJavassistProxy = true;
                        break;
                    }
                }

 这里会判断失效。导致问题。

 

后续

已报告fastjson团队,目前1.1.40版本任未修复。

 

 

spring 3+ fastjson bug 记录

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
<select id="stacked-state" style=" font-family: "Microsoft YaHei"; "> <option>分
之前遇到棘手的BUG总是在处理过后就不管了,导致后面碰到相同问题后重复工作太多。现专门开辟一篇日
遇到了两个不是很难但却有点儿类似于“找茬”的bug 1个是添加到 batch 中的 sprite 调用 removeFrom
1. 大量使用httpclient,遇到这个异常,还会导致我们的resin服务器自动重启: A fatal error has be
spring 3可以支持Rest风格参数,其内置了jackson框架作为REST的json参数转换成javabean对象,以及be
今天简单记录一下security执行 1. org.springframework.web.filter.DelegatingFilterProxy.doFilter
Overview of the Spring Framework DAO: Data Access Objects Spring DAO 的设计思想 java对象持久
Spring AOP 系统日志记录 AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,AOP实际是
基于 JDK 7或以上版本 Eclipse http://www.oracle.com/technetwork/java/javase/downloads/index.ht
OpenCV2.1 、2/。3+ VS2010的配置 因为实验室的项目,想用OpenCV实现,刚好电脑上已经装了VS2010,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号