【问题标题】:Spring MVC error: The resource identified by this request is only capable of generating responsesSpring MVC 错误:此请求标识的资源只能生成响应
【发布时间】:2012-02-11 02:43:27
【问题描述】:

当我在浏览器中调用这个 URL 时:

http://localhost:8080/app/foo.json

Spring 在此错误消息中响应 406 状态代码:

此请求标识的资源只能生成具有根据请求“接受”标头()不可接受的特征的响应。

但是我已经像这样定义了我的内容协商视图解析器:

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

}

任何想法我做错了什么?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    看起来问题是我没有添加所有必要的依赖项,在本例中为jackson-mapper-asl。我认为只添加jackson-core-asl 就足够了。

    【讨论】:

      【解决方案2】:

      @ResponseBody 和 ContentNegotiatingViewResolver 是同一事物的两个替代方案。您通常使用其中之一,而不是两者都使用。如果要使用 ContentNegotiatingViewResolver,请删除 @ResponseBody。

      【讨论】:

        【解决方案3】:

        当您使用您的网站 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 返回数据时使用的内容类型。

        【讨论】:

          【解决方案4】:

          ContentNegotiationManager 解决了这个问题。我使用的是弹簧 3.2。我已经回答了,它对我有用,特别是对于 .json,检查 here

          【讨论】:

            【解决方案5】:

            我不确定这是否能解决问题,但我确实看到您的代码存在问题。 @ResponseBody 注释应该出现在返回的项目之前,在这种情况下,FooDTO。我也希望你静态导入'RequestMethod.GET'。否则,您应该将“GET”更改为“RequestMethod.GET”。所以方法应该是:

            @RequestMapping(method = RequestMethod.GET)
                public @ResponseBody FooDTO index() {
                    // return fooDTO
                }
            

            【讨论】:

            • 不,不幸的是这并没有改变任何东西。在返回类型前加上@ResponseBody只是一种“风格”,否则Java目前不支持方法返回类型的注解。是的,我已经静态导入了RequestMethod.GET
            猜你喜欢
            • 2018-03-06
            • 1970-01-01
            • 1970-01-01
            • 2013-02-16
            • 1970-01-01
            • 2015-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多