mvc example java json hibernate spring-mvc jackson

java - example - spring mvc y rest



Extraña excepción de Jackson lanzada al serializar el objeto Hibernate (15)

Jackson está lanzando una extraña excepción que no sé cómo arreglar. Estoy usando Spring, Hibernate y Jackson.

Ya he considerado que la carga diferida está causando el problema, pero he tomado medidas para decirle a Jackson que NO procese varias propiedades de la siguiente manera:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" }) public class Director extends UserAccount implements EducationFacilityUser { .... }

He hecho lo mismo para todas las otras subclases de cuenta de usuario también.

Aquí está la excepción lanzada:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"]) at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62) at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268) at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146) at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118) at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236) at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189) at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111) at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296) at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224) at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925) at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

¿Sugerencias sobre cómo puedo obtener más información para ver qué está causando esto? ¿Alguien sabe como arreglarlo?

EDIT: descubrí que getHander () y otros métodos get * () existen en el objeto proxy. GRR !! ¿Hay alguna manera en que pueda decirle a Jackson que no procese nada en el proxy, o estoy sol? Esto es realmente extraño porque el método que escupe el JSON solo falla bajo ciertas circunstancias, no todo el tiempo. No obstante, se debe a los métodos get * () en el objeto proxy.

Aparte: los poderes son malvados. Interrumpen Jackson, equal () y muchas otras partes de la programación regular de Java. Estoy tentado de deshacerme de Hibernate por completo: /


Al igual que en otras respuestas, el problema para mí fue declarar una columna de muchos a uno para hacer una búsqueda perezosa. Cambiar a una búsqueda ansiosa resolvió el problema. Antes de:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.LAZY)

Después:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.EAGER)


Enfrenté el mismo problema y es realmente extraño que el mismo código funcione en pocos casos, mientras que falló en algunos casos aleatorios.

Lo solucioné solo asegurándome de que el setter / getter apropiado (asegurándose de que la sensibilidad del caso)


Intenté @JsonDetect y

@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })

Ninguno de los dos funcionó para mí. Usar un módulo de terceros me pareció mucho trabajo. Así que solo intenté hacer una llamada a get en cualquier propiedad del objeto perezoso antes de pasar a jackson para la serlización. El fragmento de código de trabajo se veía algo así:

@RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8") @ResponseBody @Transactional public Account authenticate(Principal principal) { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal; LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal(); User user = userRepository.findOne(loggedInUserDetails.getUserId()); Account account = user.getAccount(); account.getFullName(); //Since, account is lazy giving it directly to jackson for serlization didn''t worked & hence, this quick-fix. return account; }


No es ideal, pero podría deshabilitar el descubrimiento automático de propiedades JSON de Jackson, utilizando @JsonAutoDetect en el nivel de clase. Esto evitaría que trate de manejar las cosas de Javassist (y fallar).

Esto significa que luego debe anotar cada getter manualmente (con @JsonProperty ), pero eso no es necesariamente algo malo, ya que mantiene las cosas explícitas.


Por lo que vale, hay un proyecto del módulo Jackson Hibernate que acaba de comenzar, y que debería resolver este problema y espero que otros también. El proyecto está relacionado con el proyecto Jackson, aunque no forma parte de la fuente principal. Esto es principalmente para permitir un proceso de liberación más simple; requerirá Jackson 1.7 ya que es cuando se está introduciendo Module API.


Puede agregar una mezcla de Jackson en Object.class para ignorar siempre las propiedades relacionadas con la hibernación. Si está utilizando Spring Boot, ponga esto en su clase de aplicación:

@Bean public Jackson2ObjectMapperBuilder jacksonBuilder() { Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder(); b.mixIn(Object.class, IgnoreHibernatePropertiesInJackson.class); return b; } @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) private abstract class IgnoreHibernatePropertiesInJackson{ }



Puede usar la @JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" }) en su clase "Director"


Soy nuevo en Jackson API, cuando recibí la "org.codehaus.jackson.map.JsonMappingException: no se encontró un serializador para la clase com.company.project.yourclass", agregué el getter y el setter a com.company.project.yourclass , eso me ayudó a usar el objeto mapper de ObjectMapper para escribir el objeto java en un archivo plano.


También puede hacer que su objeto de dominio Director final. No es una solución perfecta, pero impide crear una subclase proxy de la clase de dominio.


Tengo el mismo error, pero sin relación con Hibernate. Me asusté de todas las sugerencias aterradoras, que creo que son relevantes en caso de Hibernate y carga lenta ... Sin embargo, en mi caso obtuve el error ya que en una clase interna no tenía getters / setters, por lo que el BeanSerializer no pudo serializar los datos...

Agregar getters y setters resolvió el problema.



Tuve el mismo mensaje de error del @RestController de primavera. Mi clase de controlador de reposo estaba usando la clase JpaRepository de JpaRepository y al reemplazar el método repository.getOne(id) call con repository.findOne(id) problema había desaparecido.


Tuve un problema similar con la carga diferida a través del objeto proxy de hibernación. Lo rodeé anotando la clase que tiene propiedades privadas perezosas con:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Supongo que puede agregar las propiedades en su objeto proxy que rompe la serialización JSON a esa anotación.

Evite la serialización de Jackson en objetos perezosos no recuperados


Yo tuve el mismo problema. Vea si está usando hibernatesession.load() . Si es así, intente convertir a hibernatesession.get() . Esto resolvió mi problema.