복붙노트

[SPRING] Spring에서 무시되는 Jackson 주석

SPRING

Spring에서 무시되는 Jackson 주석

도메인 클래스의 속성을 숨기려고했지만 출력 된 JSON에 계속 표시됩니다. Jackson 2.0과 Spring 3.1.1을 사용하고 있습니다.

/ users / 1의 출력 :

{"id":1,"password":null,"email":"someone@somewhere.com","firstName":"John","lastName":"Smith"}

내 도메인 클래스 :

@Entity
public class User {
    private String mPassword;
    ... 
    @JsonIgnore
    public String getPassword() {
        return mPassword;
    }

    public void setPassword(String password) {
        mPassword = password;
    }
    ...
}

내 봄 mvc 구성 :

...
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="favorPathExtension" value="true" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="defaultContentType" value="application/json"/>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
</bean>
...

그리고 내 컨트롤러 :

@Controller
@RequestMapping("/users")
public class UserController {
    private UserService mUserService;

    public UserController(){}

    @Inject
    public void setUserController(UserService userService){
        mUserService=userService;
    }

    @RequestMapping(value="/{id}", method=RequestMethod.GET)
    public void getUser(@PathVariable("id") long id, Model model){
        model.addAttribute(mUserService.getUser(id));
    }
}

해결법

  1. ==============================

    1.문제는 Spring 2.0이 Jackson 2.0에서 작동하지 않는다는 것입니다. 이것은 다음과 같은 방식으로 해결되었습니다.

    문제는 Spring 2.0이 Jackson 2.0에서 작동하지 않는다는 것입니다. 이것은 다음과 같은 방식으로 해결되었습니다.

    <bean id="jacksonMessageConverter"
              class="own.implementation.of.MappingJacksonHttpMessageConverter"/>
    
    <bean class="org.springframework.web.servlet.mvc
                 .annotation.AnnotationMethodHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <ref bean="jacksonMessageConverter"/>
                </list>
            </property>
            <property name="requireSession" value="false"/>
        </bean>
    

    그리고 own.implementation.of.MappingJacksonHttpMessageConverter는 다음을 기반으로합니다.

    http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

    그러나 ObjectMapper와 Jackson 2.0 이외의 Jackson 클래스는 Jackson 1 대신 사용하십시오. *

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

    2.Jackson 2 지원은 Spring 3.1.2 (Spring 3.2에서 역주 - SPR-9507)에 추가되었습니다. 프로젝트를 Spring 3.1.1에서 Spring 3.1.2로 업그레이드하면 Jackson 2는 이미 가지고있는 구성으로 작동합니다.

    Jackson 2 지원은 Spring 3.1.2 (Spring 3.2에서 역주 - SPR-9507)에 추가되었습니다. 프로젝트를 Spring 3.1.1에서 Spring 3.1.2로 업그레이드하면 Jackson 2는 이미 가지고있는 구성으로 작동합니다.

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

    3.Spring 3.1.2 로의 업그레이드 외에도 메시지 변환기를 org.springframework.web.servlet.view.json.MappingJackson ** 2 ** HttpMessageConverter로 변경해야한다.

    Spring 3.1.2 로의 업그레이드 외에도 메시지 변환기를 org.springframework.web.servlet.view.json.MappingJackson ** 2 ** HttpMessageConverter로 변경해야한다.

  4. ==============================

    4.Spring 4 버전을 사용하고 있다면, 다음을 수행해야합니다. 의존성 업데이트

    Spring 4 버전을 사용하고 있다면, 다음을 수행해야합니다. 의존성 업데이트

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

    이전 코드 하우스 주석 가져 오기를 다음으로 바꾸십시오. 그렇게하지 않으면 JsonIgnoreProperties와 같은 오래된 주석이 새 버전의 잭슨에서 작동하지 않습니다.

    import com.fasterxml.jackson.annotation.*;
    

    아래에서 mediaTypes를 제거하십시오. 더 이상 사용되지 않습니다.

    , 필요 없음, 활성화 프레임 워크 항아리에서 선택됩니다. Jackson보기는 다음을 사용해야합니다.

    <beans:property name="viewResolvers">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.BeanNameViewResolver" />
            <beans:bean
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <beans:property name="prefix" value="/WEB-INF/views/" />
                <beans:property name="suffix" value=".jsp" />
            </beans:bean>
            <beans:bean
                class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
                <beans:property name="viewClass"
                    value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
                <beans:property name="order" value="0"></beans:property>
            </beans:bean>
        </beans:list>
    </beans:property>
    <beans:property name="defaultViews">
        <beans:list>
            <beans:bean
                class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
        </beans:list>
    </beans:property>
    

  5. ==============================

    5.내 구성은 다음과 같습니다.

    내 구성은 다음과 같습니다.

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
      <property name="mediaTypes">
        <map>
          <entry key="html" value="text/html"/>
          <entry key="json" value="application/json"/>
        </map>
       </property>
      <property name="viewResolvers">
        <!-- this is not important for your jackson problem -->
        <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/>
      </property>
      <property name="defaultViews">
        <list>
          <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
        </list>
      </property>
    </bean>
    

    내 컨트롤러는 다음과 같이 보입니다.

    @Controller
    public class SearchController {
       @RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST})
       public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) {
           return generateSearchResponse(query);
       }
    }    
    

    내 SearchResponse는보다 복잡한 구조이지만이 유형의 객체를 포함합니다.

    @JsonIgnoreProperties({ "popis" })
    public class Kurz implements Serializable {
        private String nazev;
        private String popis;
    }
    
  6. from https://stackoverflow.com/questions/10085088/jackson-annotations-being-ignored-in-spring by cc-by-sa and MIT license