Jackson不调用CustomContextResolver的getContext()方法

时间:2016-07-03 09:18:47

标签: json rest jackson cxf

我几天来一直在努力解决这个问题,并且不知道如何解决这个问题。任何快速帮助将不胜感激。 我需要使用apache CXF和jackson从我从REST服务构建接收的JSON字符串转换LocalDate。我在Mapper对象中编写了自定义ContextResolver并注册了JavaTimeModule。 当我运行应用程序时,调用默认构造函数,这意味着它已被加载,但返回ObjectMapper的getContext()方法永远不会被调用。

我在服务器端和客户端注册了相同的ContextResolver。 所有依赖都到位(jackson数据绑定,核心,注释,数据类型-jsr310)。

当我直接在浏览器中点击REST URI时,我能够获取JSON响应。当我从客户端代码调用相同的URI注释方法时出现问题 以下是我的客户代码。

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;


@Provider //makes this bean a Provider
public class LocalDateObjectMapperContextResolver implements ContextResolver<ObjectMapper>{

    private final ObjectMapper MAPPER;

    public LocalDateObjectMapperContextResolver() {
        MAPPER = new ObjectMapper();
        MAPPER.registerModule(new JavaTimeModule());
        MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return MAPPER;
    }

}
<jaxrs:client id="testclient"
    serviceClass="package1.RESTService"
    username="abc"
    password="abc"
    address="$serviceURL">

    <jaxrs:features>
        <bean class="org.apache.cxf.transport.common.gzip.GZIPFeature"/>
        <cxf:logging/>
    </jaxrs:features>

    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
        <bean class="mypackage.LocalDateObjectMapperContextResolver"/>
    </jaxrs:providers>

</jaxrs:client>

同样,这个contextResolver也在服务器端注册

<jaxrs:server>
.....
 <jaxrs:providers>
    <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
            <bean class="mypackage.LocalDateObjectMapperContextResolver"/>
  </jaxrs:providers>
</jaxrs:server>

没有调用getContext的原因是什么?

我也试过扩展ObjectMapper并在那里注册javaTimeModule,但是不知道如何在Jackson流程中注册customObjectMapper。我只是把默认构造函数用于测试,它在应用程序启动时调用,但是再次,没有结果,我仍然得到相同的错误。

错误:找不到类型[simple type,class java.time.LocalDate]的合适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?)

2 个答案:

答案 0 :(得分:1)

我有完全相同的问题@peeskillet描述了问题评论。

我使用的是版本2中的Jackson依赖项和版本1中的jackson-jaxrs。

将所有依赖项移动到版本2时解决了所有问题。

答案 1 :(得分:0)

如果您使用的是Maven,则可以添加以下两个maven依赖项。

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
        </dependency>

并添加以下代码段。

@Configuration
public class CxfConfig {

    @Component
    @javax.ws.rs.ext.Provider
    public static class JacksonJaxbJsonProvider
            extends com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider {

        @Autowired
        private ObjectMapper objectMapper;

        @PostConstruct
        public void init() {

            objectMapper.registerModule(new Jdk8Module());

        }

    }
}