【问题标题】:Spring MVC with Jackson 2.2: "HttpMediaTypeNotAcceptableException: Could not find acceptable representation"带有 Jackson 2.2 的 Spring MVC:“HttpMediaTypeNotAcceptableException:找不到可接受的表示”
【发布时间】:2013-08-08 16:56:37
【问题描述】:

所以我正在努力让我的 bean 用 json 编码...... 首先,我尝试使用 codehaus 的 jackson 1.9.13 和 Spring MVC 3.1.1。在我设法获得“直接自我引用”异常之前,我遇到了一些问题。 查了一下,我发现我需要 fastxml 的 Jackson 2。然后我发现 (here) 我需要 Spring 3.1.2,因为以前的版本不支持 Jackson 2。

所以,毕竟……我仍然遇到同样的异常。 我的 maven 依赖项确实包括 Spring MVC 3.1.2 版本以及 Jackson 的 2 个 jars(它们都在我的构建路径中)

<!-- Jackson JSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.2.2</version>
    </dependency>

这是我尝试发送 bean 的控制器方法:

@RequestMapping(value = "/WS/{id}")
public @ResponseBody Resource displayWS(@PathVariable final int id) {
    return this.service.findById(id);
}

这是我在通话后在浏览器中收到的信息:

HTTP Status 406
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().

这里是服务器日志(JBoss 7.1.1):

12:10:59,691 TRACE [org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod] (http-localhost-127.0.0.1-8080-1) Error handling return value [type=com.steria.rm.model.InternalResource] [value=Luc MERTENS]
HandlerMethod details: 
Controller [com.steria.rm.controller.ResourceController]
Method [public com.steria.rm.model.Resource com.steria.rm.controller.ResourceController.displayWS(int)]
: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:147) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:80) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:94) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:74) [spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) [spring-webmvc-3.1.2.RELEASE.jar:3.1.2.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_21]

PS:InternalResource 是 Resource 的子级。

那么现在,发生了什么?我在某个地方看到过这个异常可能会因为任何实际上不是这个的原因而被抛出......吞下任何东西并抛出这个“高级”异常......不确定这是否是真的。

我尝试过使用headers = "Accept=*/*",使用produces = "application/json"...一次一个,两者一起,仍然无法正常工作...

有什么想法吗?
PS:我知道有很多类似的帖子,但如果不是全部的话,我所看到的大部分都是在 2012 年之前,也就是杰克逊的 2 年(5 月)发布

【问题讨论】:

  • 我已经做了一个快速简单的解决方案。请阅读我的帖子:stackoverflow.com/questions/7854030/…
  • 与下面的答案有什么不同?我的意思是我看到这个过程是不同的,但是你的方法必须提供什么下面的方法没有?

标签: json web-services spring-mvc jackson media-type


【解决方案1】:

好吧,我想通了。

首先,正如怀疑的那样,Spring MVC 并没有调用 Jackson 来序列化实体。当我找到here时,我需要将mvc:annotation-driven修改为

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
        <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

完成之后,我又回到了Direct self-reference exception...所以在我查了好一个小时之后,我终于发现我“只是”需要添加 一些类的注释。

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")

这个注解意味着如果某个对象在序列化器中被重复,它将被序列化一次,之后只会被序列化器创建的@id引用。

【讨论】:

  • 你在哪里添加了 JsonIdentityInfo?
  • 那是很久以前的事了,从那时起我就离开了 Java 世界,但我想我把它放在了类声明的正上方 (public class ... {})
  • 感谢您的帮助。我让它在没有注释的情况下工作,但它应该通过类。
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
相关资源
最近更新 更多