O método getContext () de CustomContextResolver não é chamado por Jackson
Estou lutando com esse problema há dias e não tenho idéia de como resolver isso. Qualquer ajuda rápida será grata. Preciso converter LocalDate da string JSON que estou recebendo da compilação do serviço REST usando o apache CXF e jackson. Escrevi ContextResolver personalizado e registrei JavaTimeModule no objeto Mapper. Quando executo o aplicativo, o construtor padrão é chamado, o que significa que ele foi carregado, mas o método getContext () que retorna o ObjectMapper nunca é chamado.
Registrei o mesmo ContextResolver no servidor e no cliente. Todas as dependências estão em vigor (jackson databind, core, anotation, datatype-jsr310).
Consigo buscar resposta JSON quando pressiono REST URI diretamente no navegador. Problema ocorre quando eu chamo o mesmo método anotado de URI do código do cliente Abaixo está o código do meu cliente.
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>
Da mesma forma, Este contextResolver está registrado no lado do servidor também em
<jaxrs:server>
.....
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:server>
Qualquer motivo para o getContext não ser chamado?
Também tentei estender o ObjectMapper e registrar o javaTimeModule lá, mas não sei como registrar o customObjectMapper no fluxo de Jackson. Acabei de colocar o construtor padrão para teste, e ele é chamado durante a inicialização do aplicativo, mas, novamente, Sem resultados, ainda recebo o mesmo erro.
Erro: nenhum construtor adequado encontrado para o tipo [tipo simples, classe java.time.LocalDate]: não é possível instanciar a partir do objeto JSON (é necessário adicionar / ativar informações de tipo?)