杰克逊与JodaTime和Jax-rs

时间:2017-06-19 11:05:27

标签: java rest jackson jax-rs

我有一个用Java创建的REST Web服务。我使用Joda-time作为日期,Jackson作为JSON格式。所有内容都上传到Glassfish 4.1服务器上

版本

  • avax.ws.rs-API-2.0.1.jar
  • 乔达 - 时间 - 2.7.jar
  • 杰克逊 - 注解2.8.8.jar
  • 杰克逊 - 芯 - 2.8.8.jar
  • 杰克逊 - 数据绑定-2.8.8.jar
  • jackson.datatype-乔达-2.8.8.jar

映射

@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有杰克逊版本

更新2

有没有办法使用我项目中的jackson库而不是Glassfish中的库?这似乎是解决方案

1 个答案:

答案 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下。