2011-01-18 2 views
0

이 튜토리얼을 따르고 객체를 XML에서 언 마샬링 할 수있는 RESTful 서비스를 작성하려고한다. http://www.stupidjavatricks.com/?p=54spring + xstream에서 객체를 마샬링하고 JSP 페이지가 아닌보기로 반환하는 방법

기사에서 선택한 marshaller는 xStream입니다 (사용하기 쉽고 구성하기가 쉽습니다).

요점은 tSServer에 번들로 제공되는 Eclipse의 STS - Spring 자체 풍미를 사용한다는 것입니다. MVC의 STS 템플릿을 기반으로 프로젝트를 만들었습니다. 이것은 스프링 버전 2.4에서 시작된 레거시 프로젝트이며 버전 3.0으로 마이그레이션했습니다. 그래서 템플릿은 필요한 모든 XML 마크 업을 만들었고보기를 올바른 객체 변환 (xstream 마샬 러에 연결)으로 지정하도록 구성을 추가했습니다.

<bean id="bookXmlView" class="org.springframework.web.servlet.view.xml.MarshallingView"> 
    <constructor-arg> 
     <bean class="org.springframework.oxm.xstream.XStreamMarshaller"> 
      <property name="autodetectAnnotations" value="true"/> 
     </bean> 
    </constructor-arg> 
</bean> 

그것은 모두 내가 최신 STS 버전 2.5.2.RELEASE 설치까지 잘 근무하고 : 여기

는 (링크으로부터 복사) 새로운보기로 객체를 전송 내 콩의 일부입니다 템플릿에서 새 MVC 프로젝트를 만들었습니다. (새로운 템플릿은 urlrewrite.xml을 더 이상 사용하지 않습니다. 자습서, 뷰가 항상 JSP에 관한 것이다 지금 무엇에 상관없이 알 수 없지만, 같은

내가 1 올바른 구성 1 세트 내 컨트롤러는 다음과 같습니다 경우, 정도 인 것이 :

@RequestMapping(value = "/authors/{authorId}") 
public ModelAndView getAuthorById(@PathVariable String authorId) { 
    Author author = bookService.getAuthorById(authorId); 
    ModelAndView mav =new ModelAndView("bookXmlView", BindingResult.MODEL_KEY_PREFIX+"author", author); 
    return mav; 
} 

항상 것 XML이 아닌 author.jsp 뷰로 돌아가보십시오. 나는 성공하지 못한 많은 것을 시도했다. 왜 이런 일이 일어나고 그것을 고치는 법이 있습니까?

내가 DEBUG 레벨로 설정하고 뭔가를 발견 :


UPDATE는 ------------------- 으로 내가 로그를 추가주의 :

DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 거부 콩 이름 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor':식별 된 URL 경로 DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 거부 콩 이름 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'org.springframework.web :
DEBUG 식별 된 URL 경로 .servlet.mvc.annotation.DefaultAnnotationHandlerMapping 없습니다 - 빈 이름을 거부 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
DEBUG 식별 된 URL 경로 : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 거부 콩을 name 'org.springframework.context.annotation.internalCommonAnnotationProcessor': 확인 된 URL 경로 없음
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 거부 콩 이름 'bookXmlView': 식별 된 URL 경로


공지 사항이 라인 : 거부 콩 이름 'bookXmlView' : 식별 된 URL 경로가 없습니다. xstream 설정에서 <mvc:annotation-driven />과 내 autodetectAnnotations 사이에 충돌이 표시되었을 가능성이 있습니까?

어떤 경우에는 링크를 호출 한 후 다음 로그 항목이 있습니다.

DEBUG : 그것은 /WEB-INF/views/bookXmlView.jsp 뷰에 전달 주목 org.springframework.web.servlet.DispatcherServlet - [/ 시험 DispatcherServlet에 이름을 'appServlet'처리 GET 요청/후 Page_Init]
DEBUG : org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping는 - 매핑 [/ 후 Page_Init]는 핸들러 [[email protected]] 2 인터셉터
DEBUG와 HandlerExecutionChain을 할 : org.springframework.web.servlet.DispatcherServlet - [/ test/page_init]의 Last-Modified 값은 다음과 같습니다. : -1
DEBUG : org.springframework.web.bind.annotation.support.HandlerMethodInvoker - 호출 요청 처리 방법에있어서, 공용 org.springframework.web.servlet.ModelAndView test.test.test.HomeController.getObject()
DEBUG : org.springframework.beans.factory.support.DefaultListableBeanFactory - 'bookXmlView'
DEBUG 이름으로 콩에 afterPropertiesSet()를 호출 : org.springframework.web.servlet.DispatcherServlet이 - 렌더링보기 [org.springframework .web.servlet.view.JstlView : 이름 'bookXmlView'; URL [/WEB-INF/views/xmlView.jsp] 이름을 가진 DispatcherServlet이 'appServlet'
DEBUG에서 : org.springframework.web.servlet.view.JstlView - 추가 모델 객체 'org.springframework.validation. BindingResult.books '형식으로 [test.test.test.ObjectTest]를 호출하여 이름이'bookXmlView '인 뷰에서 요청합니다.
DEBUG : org.springframework.web.servlet.view.JstlView - 리소스 [/ WEB-INF /views/xmlView.jsp] InternalResourceView 'bookXmlView'
DEBUG에서 : org.springframework.web.servlet.DispatcherServlet - 성공적으로 완료 요청

+0

로그가 뭐라고 말합니까? 모든 출력을 볼 수 있도록 로그 레벨을 ALL 또는 DEBUG로 설정하십시오. 문제는 거기에서 발견 될 것입니다. – jmort253

답변

2

마침내 찾았습니다! 먼저 다른 marshaller 인 JAXB2를 시도했지만 xstream도 잘 작동합니다. -

다음 것은 정의입니다 구성이 (잘못된)를 사용하여 어떤 이유로 밝혀 :

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

것은 InternalResourceViewResolver

를 사용하여 잠시 org.springframework.web.servlet에 대한 정의 .view.BeanNameViewResolver은 무시됩니다.

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="viewResolvers"> 
      <list> 
        <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
          <property name="prefix" value="/WEB-INF/jsp/" /> 
          <property name="suffix" value=".jsp" /> 
        </bean> 
      </list> 
    </property> 
</bean> 
<oxm:jaxb2-marshaller id="marshaller"> 
     <oxm:class-to-be-bound name="com.mycompany.dashboard.Person" /> 
</oxm:jaxb2-marshaller> 

<bean name="person" class="org.springframework.web.servlet.view.xml.MarshallingView"> 
     <constructor-arg ref="marshaller" /> 
</bean> 

그 구성이 나는 JSP보기로되지 않았습니다 함께 연주 내 문제와 사람 개체를 해결하지만, 마샬 차례가이다 : 그것을위한 해결책은 다음과 같이 에 ContentNegotiatingViewResolver라는 하나의 빈에서 둘을 정의하는 것입니다 XML :

@RequestMapping(value = "/person", method = RequestMethod.GET) 
public ModelAndView addPerson() { 
    Person person = new Person(); 
    person.setAddress("address 123"); 
    person.setAge(50); 
    person.setName("Andrew"); 
    System.out.println("new person: " + person); 
    ModelAndView mav = new ModelAndView("person",BindingResult.MODEL_KEY_PREFIX + "person",person); 
    return mav; 

앞으로 다른 사람들에게도 도움이되기를 바랍니다.

+0

JAXB가 최선의 선택입니다. http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

관련 문제