Jackson不会调用CustomContextResolver的getContext()方法 [英] getContext() method of CustomContextResolver is not called by Jackson

查看:136
本文介绍了Jackson不会调用CustomContextResolver的getContext()方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



I在服务器端和客户端注册了相同的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 //使这个bean成为Provider
公共类LocalDateObjectMapperContextResolver实现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对象实例化(需要添加/启用类型信息?)

解决方案

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



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



将所有依赖项移动到版本2时全部解决。


I am struggling with this issue for days now and have no clue how to solve this. Any quick help will be grateful. I need to convert LocalDate from JSON string which I am receiving from REST service build using apache CXF and jackson. I wrote custom ContextResolver and registered JavaTimeModule in Mapper object. When I run the application, default constructor is called, that means it has been loaded, but getContext() method which returns ObjectMapper never gets called.

I have registered same ContextResolver in server and client side. All dependencies are in place(jackson databind, core, annotation, datatype-jsr310).

I am able to fetch JSON response when I hit REST URI directly in browser. Issue comes when I call same URI annotated method from client code Below is my client code.

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>

Same way, This contextResolver is registered on server side also under

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

Any reason why getContext is not called?

I also tried by extending ObjectMapper and registering javaTimeModule there, but dont know how to register customObjectMapper in Jackson flow. I just put default constructor for testing, And it does get called while application startup, but then again, No results, I still get same error.

Error: No suitable constructor found for type [simple type, class java.time.LocalDate]: can not instantiate from JSON object (need to add/enable type information?)

解决方案

I had exactly the same problem @peeskillet describes in question comment.

I was using Jackson dependencies from version 2 and jackson-jaxrs from version 1.

All solved when moved all dependencies to version 2.

这篇关于Jackson不会调用CustomContextResolver的getContext()方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆