Jackson不会调用CustomContextResolver的getContext()方法 [英] getContext() method of CustomContextResolver is not called by Jackson
问题描述
我几天来一直在努力解决这个问题,并且不知道如何解决这个问题。任何快速帮助将不胜感激。
我需要从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屋!