Tengo un problema con la serialización de una respuesta en la aplicación REST.

Aquí hay una instantánea rápida de mi código: ResponseWrapper.class

@JsonInclude(Include.NON_NULL) 
public class ResponseWrapper {

     private User user;
     private Token token;
     private Authentication authentication;

     public ResponseWrapper(){}
     //setters and getters
}

Configuration.class

@Configuration
public class BeanConfig {

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode =    ScopedProxyMode.TARGET_CLASS) 
public ResponseWrapper response() {
    return new ResponseWrapper();
}   

}

En mi clase de implementación obtuve una variable autowired:

@Autowired
ResponseWrapper response;

Cuando devuelvo mi respuesta como

return response;

Tengo un mensaje

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.logging.ErrorManager and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.coig.prek.webservice.utils.wrappers.ResponseWrapper$$EnhancerBySpringCGLIB$$9e771672["targetSource"]->org.springframework.aop.target.SimpleBeanTargetSource["beanFactory"]->org.springframework.beans.factory.support.DefaultListableBeanFactory["beanClassLoader"]->org.apache.catalina.loader.ParallelWebappClassLoader["resources"]->org.apache.catalina.webresources.StandardRoot["context"]->org.apache.catalina.core.StandardContext["logger"]->org.apache.juli.logging.DirectJDKLog["logger"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["handlers"]->org.apache.juli.AsyncFileHandler["errorManager"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.util.logging.ErrorManager and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.coig.prek.webservice.utils.wrappers.ResponseWrapper$$EnhancerBySpringCGLIB$$9e771672["targetSource"]->org.springframework.aop.target.SimpleBeanTargetSource["beanFactory"]->org.springframework.beans.factory.support.DefaultListableBeanFactory["beanClassLoader"]->org.apache.catalina.loader.ParallelWebappClassLoader["resources"]->org.apache.catalina.webresources.StandardRoot["context"]->org.apache.catalina.core.StandardContext["logger"]->org.apache.juli.logging.DirectJDKLog["logger"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["handlers"]->org.apache.juli.AsyncFileHandler["errorManager"])

Y en realidad no tengo ni idea de lo que estoy haciendo mal. Traté de hacer una anotación @JsonIgnore con @JsonProperty pero no hubo diferencia en que trabajara. Entonces le pregunto, ¿qué estoy haciendo mal, que no se puede serializar correctamente?

Si la descripción no es suficiente, lo siento, no sé qué más podría escribir sobre este problema.

@Edit Estoy devolviendo el bean de respuesta usando la clase ResponseEntity

return new ResponseEntity<ResponseWrapper>(response, HttpStatus.OK);
1
rdabrowski 12 ene. 2017 a las 12:16

1 respuesta

La mejor respuesta

Creo que aquí, Jackson está tratando de serializar un objeto vacío. Necesita configurar jackson para evitar esto:

Jackson 1.x:

myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

Jackson 2.X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

Se puede encontrar un ejemplo para hacer esto en Spring aquí

0
Community 23 may. 2017 a las 15:08
El problema es que cuando estoy haciendo eso, obtengo "Recursión infinita" por alguna razón. Por otro lado, ese objeto serializado nunca está vacío.
 – 
rdabrowski
12 ene. 2017 a las 13:23
Intente eliminar Autowired de la instancia de respone.
 – 
Sachin Gupta
12 ene. 2017 a las 13:24
Pero si lo entiendo correctamente, no podré llamar a una instancia de ese bean
 – 
rdabrowski
12 ene. 2017 a las 13:29
Creo que la respuesta debe ser creada por el código, no por el contenedor. Así que eliminarlo debería ser bueno,
 – 
Sachin Gupta
12 ene. 2017 a las 13:32