Jackson y @Transient
Comúnmente cuando estamos desarrollando en Java necesitamos que nuestra entidad tenga propiedades que NO deben estar mapeadas a la base de datos usamos la anotación @Transient.
El problema surge cuando queremos que esa propiedad sea serializada por Jackson para enviarla en forma de JSON (en mi situación) en respuesta a una petición de un Rest Controller de Spring.
Para resolverlo será necesario sobrescribir el objeto que mapea nuestras clases de Java, tal cual como se hizo para evitar los errores al serializar propiedades Lazy Load en este post.
Pero en esta ocasión deshabilitaremos esta funcionalidad ya que, como se dijo antes, queremos que el mapeo ignore la propiedad, pero no queremos que la serialización la ignore.
Las clases relacionadas a esta configuración son Hibernate4Module, el cual tiene un ENUM dentro con las funcionalidades que podemos deshabilitar.
Al final deberá quedar así
package com.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
public class HibernateAwareObjectMapper extends ObjectMapper{
private static final long serialVersionUID = 1L;
public HibernateAwareObjectMapper() {
Hibernate4Module module = new Hibernate4Module();
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
registerModule(module);
}
}
No debemos olvidar que este clase debe estar en nuestro XML de configuración de Spring.
<mvc:annotation-driven>
<mvc:message-converters>
<!-- Use the HibernateAware mapper instead of the default -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="ruta.a.tu.clase.HibernateAwareObjectMapper" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Hay que tener en cuenta que si deshabilitamos esta funcionalidad la única forma en que podremos hacer que se ignoren propiedades de una clase en el momento de la serialización será utilizando la anotación @JsonIgnore.