当前位置: 首页 > 面试题库 >

Spring-MVC 406不可接受,而不是JSON响应

张唯
2023-03-14
问题内容

我正在尝试使用Spring 3.0.6返回JSON响应,但是得到了406响应“ Not Acceptable”,其描述为:“此请求所标识的资源仅能够生成具有以下特征的响应:请求“接受”标头()。”

我知道之前曾问过一个非常类似的问题,但尽管进行了许多测试,但我无法使它适用于我的项目,而且我不知道自己在做什么错。

在我的Maven pom.xml中,执行以下操作:

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.8.5</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-core-asl</artifactId>
  <version>1.8.5</version>
  <scope>compile</scope>
</dependency>

在web.xml中,我引用了webmvc-config.xml,并且日志确认已加载。

<servlet>
    <servlet-name>mainServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

在webmvc-config.xml中,我具有以下内容:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
    </bean> 
    <mvc:annotation-driven />

我的控制器是:

@Controller
public class ClassifiedController {

    @RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*",
                    method = RequestMethod.GET)
    @ResponseBody
    public final Classified getClassified(@PathVariable final int idClassified) {
        ...

我尝试使用或不使用headers参数,结果相同。如果我直接使用Firefox调用URL,则请求标头包含以下内容(已通过Firebug选中):

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

如果我使用以下JQuery:

$.ajax({
        url: '/classified/38001',
        type: 'GET',
        dataType: 'json'
});

发送以下标头:

Accept: application/json, text/javascript, */*; q=0.01

在这两种情况下,结果都是406错误。我不知道还要检查什么才能使其正常工作。

更新:我决定通过Spring调试,发现在杰克逊被正确调用,并且在org.codehaus.jackson.map.ser.StdSerializerProvider中,方法_findExplicitUntypedSerializer包含以下代码:

try {
    return _createAndCacheUntypedSerializer(runtimeType, property);
} catch (Exception e) {
    return null;
}

这很不幸,因为隐藏了问题的根源。使用调试器,我发现该异常包含非常描述性的错误消息:

Conflicting getter definitions for property "reminded": 
ClassifiedImpl#isReminded(0 params) vs
ClassifiedImpl#getReminded(0 params)

现在,我看到了错误消息,这是一个愚蠢的错误,很容易修复,但如果没有它,它并不是那么明显。实际上,解决问题导致序列化工作。


问题答案:

就MappingJacksonJson处理而言,你需要确保Jackson ObjectMapper支持你的对象类型进行序列化。



 类似资料:
  • 问题内容: 我正在尝试生成一个简单的JSON响应。现在,我收到406 Not Acceptable错误。Tomcat说:“此请求标识的资源只能根据请求“接受”标头生成特性不可接受的响应。” 即使我的标题是 在tomcat / lib中,我拥有所有的Tomcat jar,Spring jar和jackson-all-1.9.0.jar。我在Tomcat 7中使用Spring 3.2.2。 我知道这个

  • 我正在尝试生成一个简单的JSON响应工作。现在我收到406不接受错误。Tomcat说“此请求标识的资源仅能够根据请求“接受”标头生成具有不可接受特征的响应。”即使我的标头是 在tomcat/lib中,我有所有的tomcat罐子、Spring罐子和jackson-all-1.9.0。罐子我将Spring 3.2.2用于Tomcat 7。 我知道这个问题已经讨论过很多次了,但是没有一个解决方案对我有用

  • Spring允许在中定义。 我已经在那里为HTTP 400、404、405等定义了许多其他异常处理程序,。。。然而,HTTP 406的ExceptionHandler(不可接受)似乎不起作用。处理程序被触发,我在日志中对此进行了检查,但没有使用结果。 我的目标是返回一个带有JSON主体的HTTP 406。 变型1 变体2 但是我总是从Tomcat得到类似的超文本标记语言响应: HTTP状态406-

  • 应用程序是使用Spring MVC 4、Hibernate和jQuery开发的 下面jquery AJAX调用没有给出正确的响应。。说明406错误(不可接受) 我知道这是一个非常古老而常见的问题。我尝试过: 杰克逊罐子 在请求映射注释中:生产者作为JSON 在请求映射注释中:标头为JSON 2和3的组合 $. post而不是$. ajax(我知道这没什么区别) 我的bean对象(Validatio

  • 问题内容: 这是我的javascript: 这是我的控制器: spring-servlet.xml 收到此错误: 标头: 响应标题 请求标题 有趣的注意事项: 我收到406错误,但休眠查询同时起作用。 每当我在保管箱中更改选择时,这就是tomcat日志所说的: 可能是什么问题?之前在SO中有两个类似的问题,我在那里尝试了所有被接受的提示,但是我猜它们没有起作用… 有什么建议?随意问的问题… 问题答

  • 问题内容: 在我的pom.xml中有以下详细信息 JSP页面: 控制器: 我正在以以下方式调用我的网址: 单击按钮后,它返回url,因为 http://lt-50k7sy1:8080/QuickBooks-UX/syncAccounts它返回406,描述为: 该请求标识的资源只能根据请求“接受”标头生成特性不可接受的响应 问题答案: 将以下jar添加到Spring 4.1。*所需的pom.xml文