Jackson no llama al método getContext () de CustomContextResolver
Estoy luchando con este problema durante días y no tengo idea de cómo resolverlo. Cualquier ayuda rápida se lo agradecerá. Necesito convertir LocalDate de la cadena JSON que estoy recibiendo de la compilación del servicio REST usando apache CXF y jackson. Escribí ContextResolver personalizado y registré JavaTimeModule en el objeto Mapper. Cuando ejecuto la aplicación, se llama al constructor predeterminado, eso significa que se ha cargado, pero el método getContext () que devuelve ObjectMapper nunca se llama.
He registrado el mismo ContextResolver en el lado del servidor y del cliente. Todas las dependencias están en su lugar (jackson databind, core, annotation, datatype-jsr310).
Puedo obtener la respuesta JSON cuando presiono REST URI directamente en el navegador. El problema surge cuando llamo al mismo método anotado de URI desde el código del cliente A continuación se muestra mi código de 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>
De la misma manera, este contextResolver se registra en el lado del servidor también en
<jaxrs:server>
.....
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:server>
¿Alguna razón por la cual no se llama a getContext?
También intenté extendiendo ObjectMapper y registrando javaTimeModule allí, pero no sé cómo registrar customObjectMapper en el flujo de Jackson. Acabo de poner el constructor predeterminado para la prueba, y se llama durante el inicio de la aplicación, pero de nuevo, sin resultados, sigo teniendo el mismo error.
Error: No se encontró un constructor adecuado para el tipo [tipo simple, clase java.time.LocalDate]: no se puede crear una instancia del objeto JSON (¿necesita agregar / habilitar información de tipo?)