我有一个用Java创建的REST Web服务。我使用Joda-time作为日期,Jackson作为JSON格式。所有内容都上传到Glassfish 4.1服务器上
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper>{
final ObjectMapper mapper = new ObjectMapper();
public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
java.lang.NoSuchFieldError:WRITE_DURATIONS_AS_TIMESTAMPS
我已经found它可能在不同版本之间存在不匹配。所有的jar都来自maven存储库,我每次都会使用所需的依赖项。
我错过了什么?是否有遗失的图书馆?库有没有错误的版本?
注意:我没有使用Maven
我尝试更新glassfish4.1/glassfish/modules
内的 jackson - ?。jars 但现在我甚至无法启动服务器,因为requirement mismatch
有杰克逊版本
有没有办法使用我项目中的jackson库而不是Glassfish中的库?这似乎是解决方案
答案 0 :(得分:1)
有没有办法使用我项目中的Jackson库而不是Glassfish中的库?这似乎是解决方案。
请参阅GlassFish 4 Application Development Guide的第2章中的以下引文:
Java Servlet规范建议Web模块的类加载器在委托给它的父级之前查看本地类加载器。您可以通过在
delegate="false"
文件的class-loader元素中设置glassfish-web.xml
,使此类加载器遵循Servlet规范中的委托反转模型。仅对不与任何其他模块交互的Web模块执行此操作是安全的。 [...]默认值为
delegate="true"
,这会导致Web模块的类加载器以与其他类加载器相同的方式进行委派。必须将delegate="true"
用于访问EJB组件或充当Web服务客户端的Web应用程序 或端点。 [...]对于许多包,包括
java.*
和javax.*
,无论委托设置如何,都始终将符号解析委托给父类加载器。这可以防止应用程序覆盖核心Java运行时类或更改作为Java EE平台一部分的API规范的API版本。
在GlassFish 4 Application Deployment Guide的B部分中,您将找到glassfish-web.xml
部署描述符的示例。根据您的问题定制,您的glassfish-web.xml
文件就像:
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD
GlassFish Application Server 3.1 Servlet 3.0//EN"
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
<class-loader delegate="false" />
</glassfish-web-app>
然后将其放在您的网络模块的WEB-INF
下。