我使用的一个CXF JAX-RS应用程序使用jackson将POJO编组为JSON。这在很大程度上起作用,但有一天它在编组深度嵌套的对象时失败了NPE。
经过一番调查后,我发现杰克逊被列入Glassfish 3(通过泽西岛),去掉jackson-core-asl.jar, jackson-jaxrs.jar, jackson-mapper-asl.jar
和jackson-xc.jar
之后,一切都很美妙。我想杰克逊1.7.1(包含在GF3中)有一些错误已在我的应用程序附带的版本中修复(1.8)。
现在的问题是,为什么我首先要做到这一点呢?我原本认为我的war文件中包含的库应该优先于Glassfish的/modules
目录中的任何库。
除了从应用服务器中删除jar之外,还有更简洁的方法吗?也许还有其他依赖这些罐子的应用......
另外,我们的GF2容器仍然存在问题,但我在/lib
文件夹中找不到任何jackson库(没有像GF3那样的/modules
文件夹)。杰克逊可能藏在GF2中的任何线索(如果有的话)?
告诉Webapp类加载器更喜欢WAR提供的JAR。
添加WEB-INF / sun-web.xml(或WEB-INF / glassfish-web.xml):
...
<class-loader delegate="false"/>
...
见http://jersey.java.net/nonav/documentation/latest/glassfish.html#d4e1927
考虑使用:asadmin deploy --libraries ...
参考:http://blogs.oracle.com/alexismp/entry/more_with_deploy_libraries
如果您可能正在运行泽西岛或与Hadoop系统交互,那么杰克逊将被泽西和Hadoop包括在内;包含的版本通常都很旧。所以这可能是“古代杰克逊”问题的一个来源。