我正在尝试遵循本教程并构建一个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 - 已成功完成请求
答案 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;
希望将来能帮助别人。