Regiser JacksonJson提供者在Websphere自由档案中

jjd*_*jjd 6 jax-rs jackson websphere-liberty

我试图从EJB调用REST服务,希望利用Jackson的

@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)

以下是wlp v8.5.5.9中的技巧

Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
Run Code Online (Sandbox Code Playgroud)

相同的代码NullPointerException在wlp v16.0.0.2中生成a

Caused by: java.lang.NullPointerException
    at org.apache.cxf.jaxrs.impl.tl.ThreadLocalProviders.getContextResolver(ThreadLocalProviders.java:50)
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.locateMapper(JacksonJsonProvider.java:634)
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:413)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1356)
    at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:438)
    ... 98 more
Run Code Online (Sandbox Code Playgroud)

我在v8.5.5.9中找到了由相同问题引发的讨论,但我不确定它是如何帮助我的.正如我所说,我对v8.5.5.9中的代码没有任何麻烦

另一个讨论与Jackson v2.x有关.最初我使用了Jackson v1.9.13,但我试图切换到最新的Jeckson 2.8.0版本并应用提供的解决方案.相同的结果:应用程序在wlp 8.5.5.9中工作,并在v16.0.0.2中产生相同的错误.

有任何想法吗?

更新: 通过扩展JacksonJsonProvider类并显式提供对象映射器可以避免此问题

public class MyJacksonJsonProvider extends JacksonJsonProvider {

        public MyJacksonJsonProvider() {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setVisibilityChecker(objectMapper.getVisibilityChecker().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
            objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            setMapper(objectMapper);
       }

}
Run Code Online (Sandbox Code Playgroud)

然后在客户端注册它

Client client = ClientBuilder.newClient().register(MyJacksonJsonProvider.class);
Run Code Online (Sandbox Code Playgroud)

但是,如果它是一个错误或一个功能,那将很高兴.