[SPRING] Spring @JsonIgnore가 작동하지 않음
SPRINGSpring @JsonIgnore가 작동하지 않음
@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>
해결법
-
==============================
1.드디어 해결책을 찾았습니다. import 문을에서 변경했습니다.
드디어 해결책을 찾았습니다. import 문을에서 변경했습니다.
import org.fasterxml.jackson.annotate.JsonIgnore;
에
import org.codehaus.jackson.annotate.JsonIgnore;
기본적으로 모든 클래스에서 동일한 클래스를 사용하고 있는지 확인해야합니다.
-
==============================
2.주석은 'get'메소드에만 있어야합니다. 개인 필드에 @Json ... 주석이있는 것 같습니다.
주석은 'get'메소드에만 있어야합니다. 개인 필드에 @Json ... 주석이있는 것 같습니다.
-
==============================
3.Jackson의 구현을 사용하고 주석이 작동하지 않는다면 아마 jackson의 우선 순위가 더 높아질 수 있기 때문일 것입니다. 그러므로 당신이 잭슨 prevales의 특정 구현 (최선의 선택은 모든 클래스가 이미 annotated되어있는 것, 아마 다른 의존성이 있기 때문에)이 의존성을 응용 프로그램 모듈의 pom에 지정하도록 보장하기를 원한다면. 따라서 여러 모듈에 주석이 달린 모든 엔티티가있는 경우
Jackson의 구현을 사용하고 주석이 작동하지 않는다면 아마 jackson의 우선 순위가 더 높아질 수 있기 때문일 것입니다. 그러므로 당신이 잭슨 prevales의 특정 구현 (최선의 선택은 모든 클래스가 이미 annotated되어있는 것, 아마 다른 의존성이 있기 때문에)이 의존성을 응용 프로그램 모듈의 pom에 지정하도록 보장하기를 원한다면. 따라서 여러 모듈에 주석이 달린 모든 엔티티가있는 경우
import org.fasterxml.jackson.annotate.JsonIgnore;
모든 가져 오기를 바꾸는 대신 응용 프로그램 pom에 해당 종속성을 지정하면됩니다.
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
이것은 Spring Boot에게 당신이 사용하고자하는 구현임을 명확히 할 것이다.
-
==============================
4.org.codehaus.jackson 버전을 변경해야합니다. 현재 1.1.1 버전을 사용 중입니다. @JsonIgonre 작동 안됨. 나는 그것을 1.9.13으로 바꾸었다. @JsonIgnore는 잘 동작한다.
org.codehaus.jackson 버전을 변경해야합니다. 현재 1.1.1 버전을 사용 중입니다. @JsonIgonre 작동 안됨. 나는 그것을 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; } }
-
==============================
5.나는 봄과 동면하는 동안 같은 문제에 직면했다. 그 이유는 엔티티 클래스에서 org.codehaus.jackson.JsonIgnore를 사용하고 있었고 봄에는 com.fasterxml.jackson.jaxrs.JsonIgnore를 사용했기 때문입니다. 두 레이어 중 하나의 라이브러리로 수정하면 문제가 사라집니다.
나는 봄과 동면하는 동안 같은 문제에 직면했다. 그 이유는 엔티티 클래스에서 org.codehaus.jackson.JsonIgnore를 사용하고 있었고 봄에는 com.fasterxml.jackson.jaxrs.JsonIgnore를 사용했기 때문입니다. 두 레이어 중 하나의 라이브러리로 수정하면 문제가 사라집니다.
-
==============================
6.Spring Service 응답을 필터링하기 위해 다른 방법을 사용할 수 있습니다. 예제가있다.
Spring Service 응답을 필터링하기 위해 다른 방법을 사용할 수 있습니다. 예제가있다.
<dependency> <groupId>com.github.rkonovalov</groupId> <artifactId>json-ignore</artifactId> <version>1.0.8</version> </dependency>
코드 샘플
@FieldFilterSetting(className = User.class, fields = {"id", "password", "secretKey"}) @RequestMapping(value = "/users/signIn", params = {"email", "password"}, method = RequestMethod.POST, consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) public User signIn(@RequestParam("email") String email, @RequestParam("password") String password) { return userController.signInUser(email, password); }
여과 전 서비스 응답
{ "id": 10, "email": "janedoe@gmail.com", "fullName": "Jane Doe", "password": "12345", "secretKey": "54321", "address": { "id": 15, "apartmentNumber": 22, "street": { "id": 155, "streetName": "Bourbon Street", "streetNumber": 15 } } }
여과 후 서비스 응답
{ "email": "janedoe@gmail.com", "fullName": "Jane Doe", "address": { "id": 15, "apartmentNumber": 22, "street": { "id": 155, "streetName": "Bourbon Street", "streetNumber": 15 } } }
또한 Collection / Map에서 하위 클래스 나 클래스의 필드를 필터링하도록 구성 할 수 있습니다. 자세한 내용은 GitHub 프로젝트를 참조하십시오. 링크
from https://stackoverflow.com/questions/19894955/spring-jsonignore-not-working by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 양식이있는 봄 mvc 날짜 형식 : 입력 (0) | 2018.12.24 |
---|---|
[SPRING] Tiles view (JSP)에서 Spring 빈에 접근하기 (0) | 2018.12.24 |
[SPRING] Spring 3 빈 인스턴스화 시퀀스 (0) | 2018.12.24 |
[SPRING] Spring IoC를 사용하여 enum 값 설정하기 (0) | 2018.12.24 |
[SPRING] Spring Boot에서이 spring.jpa.open-in-view = true 속성은 무엇입니까? (0) | 2018.12.24 |