如何编组对象并在spring + xstream中作为视图(而不是JSP页面)返回

时间:2011-01-18 07:54:33

标签: spring-mvc marshalling xstream

我正在尝试遵循本教程并构建一个RESTful服务,该服务可以将对象解析为/从XML编组。 http://www.stupidjavatricks.com/?p=54

文章中选择的编组器是xStream(我发现它非常易于使用和配置)。

关键是,使用STS - Spring自己的与tcServer捆绑的Eclipse风格 - 我基于MVC的STS模板构建了一个项目。这是从Spring 2.4版开始的遗留项目,我将其迁移到3.0版。因此,模板创建了所有必要的XML标记,并添加了我的配置以将视图指向正确的对象转换(到xstream marshaler)。

这是我的bean的一部分,它将对象发送到一个新视图(从链接中复制出来):

<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,所以如果我的控制器看起来像这样:

@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;  
}

它总是会尝试返回到author.jsp视图而不是XML对象。我尝试了许多没有成功的事情。任何想法为什么会发生这种情况以及如何解决它?


更新------------------- 如上所述,我添加了日志:

我将其设置为DEBUG级别并发现了一些内容:

  

DEBUG :org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 拒绝的bean名称'org.springframework.context.annotation.internalConfigurationAnnotationProcessor':未识别任何URL路径
   DEBUG :org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 拒绝的bean名称'org.springframework.context.annotation.internalAutowiredAnnotationProcessor':未识别任何URL路径
   DEBUG :org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 拒绝的bean名称'org.springframework.context.annotation.internalRequiredAnnotationProcessor':未识别任何URL路径
   DEBUG :org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 拒绝的bean名称'org.springframework.context.annotation.internalCommonAnnotationProcessor':未识别任何URL路径
   DEBUG:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 拒绝的bean名称'bookXmlView':未识别任何URL路径


请注意以下行:拒绝的bean名称'bookXmlView':未识别任何URL路径。 搜索到这可能表示{x}设置中<mvc:annotation-driven />和我的autodetectAnnotations之间存在冲突?

任何情况下,在调用链接后,我得到以下日志条目。请注意,它将视图转发到/WEB-INF/views/bookXmlView.jsp:

  

DEBUG :org.springframework.web.servlet.DispatcherServlet - 名为'appServlet'的DispatcherServlet处理[/ test / page_init]的GET请求
   DEBUG :org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - 使用处理程序[test.test.test.HomeController@a087de]和2个拦截器将[/ page_init]映射到HandlerExecutionChain    DEBUG :org.springframework.web.servlet.DispatcherServlet - [/ test / page_init]的Last-Modified值为:-1
   DEBUG :org.springframework.web.bind.annotation.support.HandlerMethodInvoker - 调用请求处理程序方法:public org.springframework.web.servlet.ModelAndView test.test.test.HomeController.getObject()<登记/>    DEBUG :org.springframework.beans.factory.support.DefaultListableBeanFactory - 在bean上调用afterPropertiesSet(),名称为“bookXmlView”
   DEBUG :org.springframework.web.servlet.DispatcherServlet - 渲染视图[org.springframework.web.servlet.view.JstlView:name 'bookXmlView'; DispatcherServlet中的URL [/WEB-INF/views/xmlView.jsp]],名称为“appServlet”
   DEBUG :org.springframework.web.servlet.view.JstlView - 在视图中添加了类型为[test.test.test.ObjectTest]的模型对象'org.springframework.validation.BindingResult.books'名称'bookXmlView'
   DEBUG :org.springframework.web.servlet.view.JstlView - 在InternalResourceView'bookXmlView'中转发资源[/WEB-INF/views/xmlView.jsp]    DEBUG :org.springframework.web.servlet.DispatcherServlet - 已成功完成请求

1 个答案:

答案 0 :(得分:2)

终于知道了! 首先,我尝试了一个不同的编组器 - 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 的定义。解决方法是在一个名为 ContentNegotiatingViewResolver 的bean中定义它们,如下所示:

    <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视图,但是marshaller转向了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;

希望将来能帮助别人。