Spring @JsonIgnore 不起作用
Posted
技术标签:
【中文标题】Spring @JsonIgnore 不起作用【英文标题】:Spring @JsonIgnore not working 【发布时间】:2013-11-22 13:57:58 【问题描述】:如何让@JsonIgnore 工作我有一堂课。即使我把注释放在那里,它对输出也没有影响。我正在使用杰克逊。
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;
这是我的控制器方法:
@RequestMapping(value = "/questionBlock/id",produces = "application/json;charset=UTF-8")
@ResponseBody
public QuestionBlock getQuestionBlock(@PathVariable("id") int id)
return surveyService.getQuestionBlock(id);
这是我的 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>
【问题讨论】:
当你说它什么都不做时,说明正在发生的事情和你期望发生的事情会很有帮助。我在这里假设您正在接收 JSON 响应并且所有字段都在该响应中。您希望 @JsonIgnore 属性导致“qSurveys”被隐藏。 是的,我希望调查不显示在回复中。 为什么你总是在错误的地方在上面的示例代码中添加@JsonIgnore注解?应该只有一个,并且应该在 'get' 方法上。 您是否收到了包含所有其他“获取”方法的结果的有效 JSON? 我试图把它只放在 get 方法上,它不起作用。是的,我得到了一个有效的 JSON,其中包含所有其他“获取”方法的结果。 【参考方案1】:注释应该只在“get”方法上。您的私有字段上似乎有 @Json... 注释。
【讨论】:
它们不是相互抵消的。 对我来说就是这种情况。我必须显式添加一个 getter 并用@JsonIgnore
将它注释到一个用 lombok 的 @Data
注释的类中。
这也是我的情况。我必须添加对属性的托管/反向引用,然后用 @JsonIgnore
注释 getter
这是唯一可行的解决方案,非常感谢【参考方案2】:
我终于找到了解决办法。我将导入语句从
import com.fasterxml.jackson.annotate.JsonIgnore; // com. instead of org.
到
import org.codehaus.jackson.annotate.JsonIgnore;
基本上你必须确保你在所有地方都使用同一个类。
【讨论】:
你为什么在一个项目中使用两个 Jackson 实现?你应该选择一个。 遇到了同样的问题。在我的 POM 中有 fastxml.jackson,还有将 codehaus.jackson 作为依赖项的 Jersey。 我不得不反其道而行之,但这篇文章帮助我注意到我的 pom.xml 中有两个 Jackson 实现。 非常感谢!我在编写 mapreduce 项目时遇到了同样的问题。然后我发现我在hadoop映射器类中使用org.apache.htrace.fasterxml.jackson.databind.ObjectMapper
而不是com.fasterxml.jackson.databind.ObjectMapper
,所以我的注释在我更改导入之前永远不会起作用。我非常依赖 ide 自动完成功能,有时它会显示错误的课程。
发生这种情况的实际原因是 codehaus 依赖项在您的 maven 依赖项中比 fastxml 依赖项具有更高的优先级。解决此问题的一种方法是在更高的优先级中指定所需的实现:在应用程序模块中。【参考方案3】:
您需要更改 org.codehaus.jackson 版本。 我目前正在使用 @JsonIgonre 的 1.1.1 版本 不管用。 我用 1.9.13 更改了它,然后 @JsonIgnore 工作正常。
<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>
Java 代码是:-
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;
【讨论】:
【参考方案4】:我在使用 spring 和 hibernate 时遇到了同样的问题。原因是在实体类中我使用的是 org.codehaus.jackson.JsonIgnore,而在春天我使用的是 com.fasterxml.jackson.jaxrs.JsonIgnore。修复两个层中的任何一个库,问题就会消失。
【讨论】:
【参考方案5】:如果您正在使用 Jackson 的实现并且其注释不起作用,这可能是因为您有另一个优先级更高的 jackson 依赖项。因此,如果您想确保 jackson prevales 的某些实现(恕我直言,最好的选择是您已经对所有类进行了注释,因为它可能带有其他依赖项)在应用程序模块的 pom 中指定此依赖项。因此,如果您在多个模块中有所有实体都用
注释import com.fasterxml.jackson.annotate.JsonIgnore; // note: com. instead of org.
无需替换所有导入,只需在应用程序 pom 中指定相应的依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
这将向 Spring Boot 阐明这是您要使用的实现。
【讨论】:
【参考方案6】:我在项目中遇到了这个问题,终于找到了解决方案。
替换依赖...
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
导入:com.fasterxml.jackson.annotation.JsonIgnore;
我希望,它会工作。
【讨论】:
【参考方案7】:就我而言,JsonIgnore 不仅仅在日期上工作。然后我明白这是因为我用来定义日期格式的@JsonFormat()。删除它解决了问题。
【讨论】:
【参考方案8】:我为布尔值添加了@Getter(onMethod_=@JsonIgnore)。
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestClass
@JsonIgnore
private String name;
@Getter(onMethod_=@JsonIgnore)
private boolean isValid;
【讨论】:
`@Getter(onMethod_=@JsonIgnore)`为我工作,谢谢【参考方案9】:将@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
放在字段声明之前解决了我的问题。
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<Survey> surveys = new ArrayList<>();
我使用的是杰克逊版本 2.11.3
【讨论】:
以上是关于Spring @JsonIgnore 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
JsonIgnore 属性不断序列化 ASP.NET Core 3 中的属性