使用JSON的Spring RESTful Web服务提供HTTP 406错误代码

时间:2013-12-12 12:53:22

标签: json spring web-services rest spring-mvc

我使用Spring 3.2.5创建RESTful Web服务。为了实现它,我使用了@ResponseBody标记。当我使用InternalResourceViewResolver并尝试加载Html响应时,它工作正常。但是当我调用标记为@ResponseBody的URL时,它会将 HTTP 406 错误代码与错误文本一起提供

  

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

我也在我的lib目录中包含了Jackson jar文件。

这是我的处理服务请求的控制器方法。

@ResponseBody
@RequestMapping (value = "/resp.htm")
public Data jsonResp() {
    Data d = new Data();

    d.setName("TEst");
    d.setAddr("Address....");

    return d;
}

有很多问题已被提及&回答,我尝试了很多,但它仍然给出了相同的结果。然后我遇到了一种新的答案,说明使用ContentNegotiatingViewResolver。通过使用它,我能够以预期的格式查看响应。那是JSON格式。

使用ContentNegotiatingViewResolver后,servlet调度程序代码如下所示:

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
        </map>
    </property>

    <property name="defaultViews">
        <list>
            <!-- JSON View -->
            <bean
                class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
            </bean>
        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
</bean>

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="order" value="2" />
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
</bean>

所以,我的问题是,每当我们需要使用Spring的Web服务功能时,我们是否必须要求ContentNegotiatingViewResolver

5 个答案:

答案 0 :(得分:2)

在类路径中添加gson 。以及jackson

答案 1 :(得分:1)

在从angular 8调用spring rest服务以上传文件时,我遇到了类似的问题。我正在使用ResponseEntity封装成功或失败消息,对此我有406个响应。我所做的只是在UI端this.httpClient.post(url,formData,{responseType:'text'}),并且我能够接受字符串作为服务响应的响应。

答案 2 :(得分:0)

与自定义类类型一起使用的注释@ResponseBody通常使用MappingJackson2HttpMessageConverter将对象转换为JSON并将其返回到application/json内容中。

由于您的请求不包含Accept的{​​{1}}标头,因此Spring将其创建的内容视为不可接受,而是返回406.

您只需更改添加application/json标头的请求即可。 (您无法在浏览器中轻松完成此操作)。

答案 3 :(得分:0)

在我的情况下,请求有.html后缀并收到此错误。一旦删除,它工作正常。

答案 4 :(得分:0)

您需要做的就是在类路径中添加jackson个库找到它们Here