我尝试使用 ResponseBody 返回 json 和 xml 响应,它对于 xml 工作正常,但不返回 json。我的 xml 请求 uri 是“../home.xml”,而 json 请求 uri 是“../home.json”,来自 Controller 方法:
@RequestMapping("home.*")
public @ResponseBody Message homeOther(HttpServletRequest request, HttpServletResponse response, ModelMap mv){
Message msg = new Message();
msg.setDetail("I am here at home");
msg.setUploadDate(new Date());
mv.addAttribute("message", msg);
return msg;
}
这是调度程序 servlet:
<context:component-scan base-package="com.ym"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
</bean>
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/views"/>
</bean>
<!-- Simple ViewResolver for Velocity, appending ".vm" to logical view names -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="order" value="2" />
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".vm"/>
<property name="toolboxConfigLocation" value="/WEB-INF/toolbox.xml"/>
<!-- if you want to use the Spring Velocity macros, set this property to true -->
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="contentType" value="text/html; charset=UTF-8" />
</bean>
<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" />
<bean id="xmlView" class="org.springframework.web.servlet.view.xml.MarshallingView"
>
<constructor-arg ref="xstreamMarshaller" />
</bean>
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter" />
<ref bean="marshallingHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
<bean id="marshallingHttpMessageConverter"
class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="xstreamMarshaller"/>
<property name="unmarshaller" ref="xstreamMarshaller"/>
</bean>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
</bean>
<ref bean="xmlView" />
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
这是 XML 响应:
<com.ym.mongodb.model.Message>
<messageId>0</messageId>
<detail>I am here at home</detail>
<uploadDate>2013-03-09 09:56:46.606 UTC</uploadDate>
</com.ym.mongodb.model.Message>
我的问题是: 1. 磨损配置是什么?为什么它不返回 json 响应。? 2. 为什么它返回的xml中显示的是Message的完全限定名称? 我正在使用 Spring 3.1。
编辑: 有趣的是,当请求类型设置正确时,它确实会正确创建 json n xml。但第二个问题仍然存在。
最佳答案
我不知道您想详细实现什么目标,所以我不知道我是否可以提供帮助,但我会尝试一下。
首先,您可以尝试添加接受 header 。下面是一个例子。
@RequestMapping(value = "/home/yourpath", method = RequestMethod.GET,
headers = "Accept=application/xml, application/json")
通过添加接受 header ,在调用您的方法并解析数据(例如使用curl 客户端)时,将接受 json 和 xml 请求。也许您应该考虑显式设置请求方法。
当您向客户端发送请求时,请确保根据您发送的内容将“Content-Type: application/json”或“Content-Type: application/xml”添加到请求的 header 中。否则,您将收到不受支持的内容类型错误,因为您可能发送了错误的内容类型。
有两种方法可以在 Spring 中实际显示正确的内容类型。
1:通过解析/接受请求 header 中的正确内容类型(通过在客户端中配置接受 header )。
2:通过配置文件扩展名(某些默认文件扩展名应该开箱即用。包括 xml 和 json)。尝试将 .xml 或 .json 添加到您的 uri 末尾。
看下面的例子: http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/
我无法帮助你解决第二个问题。
我希望这有帮助。祝你好运。
亲切的问候, 克里斯
关于java - 使用 spring 3.1 不返回 json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15309568/