dubbox被dangdangdotcom接手后进行了若干升级和改进,特别是 rpc-rest 协议让跨语言集成变得简单。我对其中一个项目后端采用了 dubbox 框架的 rpc-rest 协议,dubbox引用了jackson-2.3.3,但在注解实体类的序列化和反序列化时又必须使用jackson-1.x,相当于dubbox-2.8.4 同时依赖 jackson 1.x 和 2.x,这个就有点混乱了。由于jackson 1.x 和 2.x使用了不同的package,在编写单元测试和引用时很容易混淆两个版本;而且由于其中一个module 在多个项目中使用了,不同项目之间的兼容性问题又出现了。
为了解决dubbox引用多个jackson版本的问题,尝试按照 Dubbo之——改造Dubbo,使其能够兼容Spring 4注解配置 - z69183787的专栏 升级到 spring 4.x,直接clone dubbox、修改源码并编译发布,最后使用 tcp monitor观察json文本,看到Date类型字段仍然是一个长整型时间戳,jackson-2.x的注解没有起作用!又search了其他一些技术贴,几天里都没有解决。
中间还尝试修改dubbo:protocol 在 dubbo-context.xml中,仍然 jackson-2.3.3 的注解不起作用:
<dubbo:protocol name="rest" port="8080" server="servlet" contextpath="bmserver" serialization="jackson2"></dubbo:protocol>
偶然翻到 dubbox rest协议jackson 反序列化的坑 这个技术贴,看到 resteasy 引用了jackson-1.9.12!
于是先使用maven排除法:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
</exclusion>
</exclusions>
</dependency>
以为resteasy 会由于找不到jackson 1.9.12自动使用 dubbox 引用的 jackson-2.3.3,然鹅resteasy并没有这么做!!
继续……在maven repository上search resteasy,居然发现resteasy有两个module,分别是 resteasy-jackson-provider 和 resteasy-jackson2-provider!考虑到 dubbox 引用了resteasy,但对 resteasy 如何序列化和反序列化json并没有约定,直接使用resteasy-jackson2-provider 不就可以了么!测试发现果然可以正常工作了,实体类的Date注解工作正常了,序列化成了ISODate格式。
至此,fork了dubbox项目 https://github.com/abelli85/dubbox,直接修改maven文件中为 resteasy-jackson2-provider,重新编译发布,再重新编译发布我的几个项目,终于不需要再一个个项目编写两个版本的注解了!