jsonvalue jsonrawvalue jsonformat example java spring jackson

java - jsonrawvalue - Primavera @JsonIgnore no funciona



objectmapper jackson (5)

Enfrenté el mismo problema mientras trabajaba con Spring e Hibernate. La razón de esto fue que en la clase de entidad estaba usando org.codehaus.jackson.JsonIgnore y en primavera estaba usando com.fasterxml.jackson.jaxrs.JsonIgnore. Arreglar a cualquier biblioteca en ambas capas y el problema desaparecerá.

¿Cómo puedo hacer que @JsonIgnore funcione? Tengo una clase. E incluso si pongo la anotación allí no tiene efecto en la salida. Estoy usando Jackson.

public class QuestionBlock implements ComparableByID{ int ID; String title; String description; boolean deleted; boolean isDraft; boolean visible; Timestamp modifiedDate; String modifiedBy; private List<Question> questions = new ArrayList<>(); @JsonIgnore private List<Survey> surveys = new ArrayList<>(); ... @JsonIgnore public List<Survey> getSurveys() { return surveys; } @JsonIgnore public void setSurveys(List<Survey> surveys) { this.surveys = surveys; } }

Este es mi método de controlador:

@RequestMapping(value = "/questionBlock/{id}",produces = "application/json;charset=UTF-8") @ResponseBody public QuestionBlock getQuestionBlock(@PathVariable("id") int id) { return surveyService.getQuestionBlock(id); }

Aquí está mi servlet-context.xml:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <mvc:annotation-driven /> <mvc:resources mapping="/resources/**" location="/resources/" /> <mvc:resources location="/, classpath:/META-INF/web-resources/" mapping="/resources/**" /> <context:property-placeholder location="classpath*:META-INF/*.properties" /> <context:component-scan base-package="com.adam.czibere" /> <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="myDataSource" name="dataSource"> <property name="driverClassName" value="${database.driverClassName}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="1800000" /> <property name="numTestsPerEvictionRun" value="3" /> <property name="minEvictableIdleTimeMillis" value="1800000" /> <property name="validationQuery" value="SELECT 1" /> </bean> <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="packagesToScan"> <array> <value>com.adam.czibere</value> </array> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect </value> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="html" value="text/html" /> <entry key="json" value="application/json" /> </map> </property> <property name="viewResolvers"> <list> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="prefixJson" value="false" /> <property name="objectMapper" ref="jacksonObjectMapper" /> </bean> </list> </property> </bean> <bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="prefixJson" value="false" /> <property name="supportedMediaTypes" value="application/json" /> </bean> </list> </property> </bean> </beans>


Finalmente he encontrado una solución. Cambié la declaración de importación de

import org.fasterxml.jackson.annotate.JsonIgnore;

a

import org.codehaus.jackson.annotate.JsonIgnore;

Básicamente tienes que asegurarte de estar usando la misma clase en todas partes.


La anotación solo debe estar en los métodos ''obtener''. Parece que tienes @Json ... anotaciones en tus campos privados.


Necesitas cambiar tu versión de org.codehaus.jackson. Actualmente estoy usando la versión 1.1.1 en la que @JsonIgonre no está funcionando. Lo cambié con 1.9.13 y luego @JsonIgnore está funcionando bien.

<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.1.1</version> </dependency> Change to <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.13</version> </dependency>

Y el código de Java es: -

import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.codehaus.jackson.annotate.JsonIgnore; @Entity @Table(name="users") public class Users implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; private String username; private String firstname; @JsonIgnore private String lastname; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }


Si está utilizando una implementación de Jackson y sus anotaciones no funcionan, es probable que tenga otra dependencia de Jackson con mayor prioridad. Por lo tanto, si desea asegurarse de que cierta implementación de jackson prevalezca (en mi humilde opinión, la mejor opción es aquella con la que ya tiene anotadas todas las clases, porque probablemente vino con otras dependencias) especifique esta dependencia en el pom del módulo de la aplicación. Así que si tienes en múltiples módulos todas tus entidades anotadas con

import org.fasterxml.jackson.annotate.JsonIgnore;

En lugar de reemplazar todas las importaciones, solo especifique la dependencia correspondiente en la aplicación pom:

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>

Esto le aclarará a Spring Boot que esta es la implementación que desea utilizar.