Spring MVC错误:此请求标识的资源只能生成响应

时间:2012-02-11 02:43:27

标签: java spring spring-mvc

当我在浏览器中调用此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
    }

}

任何想法我做错了什么?

5 个答案:

答案 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
    }