복붙노트

[SPRING] Spring @JsonIgnore가 작동하지 않음

SPRING

Spring @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. ==============================

    1.드디어 해결책을 찾았습니다. import 문을에서 변경했습니다.

    드디어 해결책을 찾았습니다. import 문을에서 변경했습니다.

    import org.fasterxml.jackson.annotate.JsonIgnore;
    

    import org.codehaus.jackson.annotate.JsonIgnore;
    

    기본적으로 모든 클래스에서 동일한 클래스를 사용하고 있는지 확인해야합니다.

  2. ==============================

    2.주석은 'get'메소드에만 있어야합니다. 개인 필드에 @Json ... 주석이있는 것 같습니다.

    주석은 'get'메소드에만 있어야합니다. 개인 필드에 @Json ... 주석이있는 것 같습니다.

  3. ==============================

    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. ==============================

    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. ==============================

    5.나는 봄과 동면하는 동안 같은 문제에 직면했다. 그 이유는 엔티티 클래스에서 org.codehaus.jackson.JsonIgnore를 사용하고 있었고 봄에는 com.fasterxml.jackson.jaxrs.JsonIgnore를 사용했기 때문입니다. 두 레이어 중 하나의 라이브러리로 수정하면 문제가 사라집니다.

    나는 봄과 동면하는 동안 같은 문제에 직면했다. 그 이유는 엔티티 클래스에서 org.codehaus.jackson.JsonIgnore를 사용하고 있었고 봄에는 com.fasterxml.jackson.jaxrs.JsonIgnore를 사용했기 때문입니다. 두 레이어 중 하나의 라이브러리로 수정하면 문제가 사라집니다.

  6. ==============================

    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 프로젝트를 참조하십시오. 링크

  7. from https://stackoverflow.com/questions/19894955/spring-jsonignore-not-working by cc-by-sa and MIT license