Я пытаюсь вызвать службу REST из EJB, надеясь использовать
@JsonIgnoreProperties(ignoreUnknown = true)
Следующее делает трюк в wlp v8.5.5.9
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
Тот же код создает NullPointerException
в wlp v16.0.0.2.
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
Я нашел обсуждения, вызванные теми же проблемами в версии 8.5.5.9, но я не знаю, как это может мне помочь. Как я заметил, у меня нет проблем с кодом в версии 8.5.5.9.
Другой обсуждение было связано с версией Jackson v2.x. Изначально я использовал Jackson v1.9.13, но попытался перейти на новейшую версию Jackson 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);
}
}
а затем зарегистрировать его в клиенте
Client client = ClientBuilder.newClient().register(MyJacksonJsonProvider.class);
Однако было бы неплохо понять, баг это или фича.