当我在浏览器中调用此URL时:
http://localhost:8080/app/foo.json
Spring在此错误消息中回复了406状态代码:
此请求标识的资源只能根据请求生成具有不可接受的特征的响应"接受" headers()。
但是我已经定义了我的内容协商视图解析器,如下所示:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="favorPathExtension" value="true" />
<property name="ignoreAcceptHeader" value="true" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="html" value="text/html"/>
</map>
</property>
</bean>
我的控制器定义如下:
@Controller
@RequestMapping(value = "/foo")
public class ToowootController {
@RequestMapping(method = GET)
@ResponseBody
public FooDTO index() {
// return fooDTO
}
}
任何想法我做错了什么?
答案 0 :(得分:10)
看起来问题是我没有添加所有必需的依赖项,在本例中为jackson-mapper-asl
。我认为只添加jackson-core-asl
就足够了。
答案 1 :(得分:2)
@ResponseBody和ContentNegotiatingViewResolver是同一件事的两种选择。您通常使用其中一个,而不是两个。如果要使用ContentNegotiatingViewResolver,请删除@ResponseBody。
答案 2 :(得分:0)
当您使用您的网站 ContentNegotiatingViewResolver ModelAndViews 返回控制器或查看名称时,ContentNegotiatingViewResolver将根据各种条件选择正确的数据表示策略。
因此,您不仅可以返回对象DTO。
示例配置
<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>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
@Controller
@RequestMapping(value = "/foo")
public class ToowootController {
@RequestMapping(method = GET)
@ResponseBody
public ModelAndView index() {
return new ModelAndView("xxxx", "Foo", FooDTO);
}
}
扩展将告诉Spring返回数据时要使用的内容类型。
答案 3 :(得分:0)
ContentNegotiationManager解决了这个问题。我使用的是弹簧3.2。我已经回答了,它为我工作,尤其是.json,请检查here。
答案 4 :(得分:-3)
我不确定这是否会解决问题,但我确实发现您的代码存在问题。 @ResponseBody
注释应位于返回的项目之前,在本例中为FooDTO
。我也希望你静态导入'RequestMethod.GET'。否则你应该将'GET'改为'RequestMethod.GET'。所以该方法应为:
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody FooDTO index() {
// return fooDTO
}