복붙노트

[SPRING] Spring MappingJacksonJsonView, JSP 뷰 대신 사용하는 법을 가르쳐주세요.

SPRING

Spring MappingJacksonJsonView, JSP 뷰 대신 사용하는 법을 가르쳐주세요.

내가 성공하지 않고 Spring 3.0에서 MappingJacksonJsonView를 사용하려고한다. 내가 뭘 잘못하고 있는지 모르겠다. 문제는 MappingJacksonJsonView를 사용하여 요청을 렌더링하는 방법을 알 수 없다는 것이다. MappingJacksonView의 뷰 이름과 빈 이름에 동일한 이름을 사용하려고했지만 작동하지 않았습니다. 여기에 샘플 테스트 애플리케이션을 구축했습니다. https://github.com/stivlo/restjson

web.xml에서 ContextLoaderListener와 dispatcherServlet에 대한 매핑을 정의했습니다.

servlet-context.xml에 내가 추가했습니다.

<mvc:annotation-driven/>

<bean name="jsonView"
    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

org.obliquid.restjson.web.ToDoList.java에서 논리적 뷰 이름을 jsonView로 설정했습니다.

그러나 MappingJacksonJsonView를 사용하는 대신 내 JSP 맵핑에 따라 JSP 파일을 찾습니다.

message /restjson/WEB-INF/jsp/jsonView.jsp
description The requested resource (/restjson/WEB-INF/jsp/jsonView.jsp) 
    is not available.

MappingJacksonJsonView를 렌더러로 사용하려면 무엇을 변경해야합니까?

업데이트 1 : 다음 테스트에서 나는 다음을 servlet-context.xml에 추가하면 JSON 렌더링이 작동하지만 JSP (홈)로 렌더링 된 다른 뷰는 더 이상 작동하지 않는다는 것을 알게되었습니다.

<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

업데이트 2 : BeanNameViewResolver를 제거하고 ModelAndView 대신 JSON에서 @ResponseBody 주석을 사용하여 다음과 같이 변환 할 컬렉션을 직접 반환하도록 ToDoList.java를 변경했습니다.

@RequestMapping("/toDoList")
public @ResponseBody List<ToDoItem> test() {
    List<ToDoItem> toDoList = new ArrayList<ToDoItem>();        
    toDoList.add(new ToDoItem(1, "First thing, first"));
    toDoList.add(new ToDoItem(1, "After that, do the second task"));
    return toDoList;
}

이 방법으로 작동합니다. 매핑이 더욱 "마법 같은"경우에도. 예를 들어 비슷한 렌더러가 XML 용으로 존재한다면 스프링이 어떤 렌더러를 고를 지 어떻게 알 수 있을까요?

해결법

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

    1.Spring은 가장 적절한 뷰를 리턴하기 위해 클라이언트가 보낸 Accept 헤더를 사용할 것이다. JSON과 XML을 모두 반환하는 Spring MVC 애플리케이션을 찾을 수있다.

    Spring은 가장 적절한 뷰를 리턴하기 위해 클라이언트가 보낸 Accept 헤더를 사용할 것이다. JSON과 XML을 모두 반환하는 Spring MVC 애플리케이션을 찾을 수있다.

    보시다시피, 나는 단지 필요 :

    <mvc:annotation-driven />
    

    나는 또한 @RequestMapping 메소드와 @ResponseBody에 대한 요청을 맵핑하기 위해 @RequestMapping을 사용하여 컨트롤러에서 리턴하는 것이 실제 응답임을 Spring에 알려준다. 그러나 약간의 조정 / 포맷팅이 필요할 수도 있습니다. 여기에서 Spring은 JSON과 같은 가장 적절한 유형으로 객체를 정렬 처리합니다.

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

    2.당신은 이렇게해야합니다 :

    당신은 이렇게해야합니다 :

    XML 파일에서 다음을 설정하십시오. set

    <mvc:annotation-driven />
    

    잭슨 시리얼 라이저를 설정해야합니다.

    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <list>
        <ref bean="jacksonMessageConverter"/>
      </list>
    </property>
    </bean>
    

    그 후에 컨트롤러에서 사용할 수 있습니다.

    @RequestMapping(value="/getObjects",method = RequestMethod.POST)
         @ResponseBody
         public  List<MyObject> getCategories(){
         List<MyObject> objects = daoService.gettAllObjects();
         return objects;
        }
    
  3. ==============================

    3.내 경우에는 다음을 추가했습니다.

    내 경우에는 다음을 추가했습니다.

    <mvc:annotation-driven />
    
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
            <property name="order" value="0" />
        </bean>
    

    그래서 기본적으로 우리는 어떤 뷰를 먼저 bean으로 해결하려고 노력해야합니다.

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

    4.ContentNegotiatingViewResolver를보고 defaultviews 속성을 MappingJacksonJsonView로 설정해야하며 @ResponseBody는 ViewSolver 대신 HttpMessageConverter를 사용합니다. 차이점은 http://ufasoli.blogspot.com/2013/08/viewresolver-vs-messageconverter-spring.html

    ContentNegotiatingViewResolver를보고 defaultviews 속성을 MappingJacksonJsonView로 설정해야하며 @ResponseBody는 ViewSolver 대신 HttpMessageConverter를 사용합니다. 차이점은 http://ufasoli.blogspot.com/2013/08/viewresolver-vs-messageconverter-spring.html

  5. from https://stackoverflow.com/questions/6794974/spring-mappingjacksonjsonview-how-to-tell-to-use-it-instead-of-jsp-view by cc-by-sa and MIT license