使用Jackson 2.2的Spring MVC:“HttpMediaTypeNotAcceptableException:找不到可接受的表示”

13 浏览
0 Comments

使用Jackson 2.2的Spring MVC:“HttpMediaTypeNotAcceptableException:找不到可接受的表示”

我正努力将我的bean编码为json......首先我尝试了codehaus的jackson 1.9.13和Spring MVC 3.1.1。直到我解决了“直接自我引用”异常问题之前,我遇到了一些问题。

查询后,我发现需要fasterxml的Jackson 2. 然后我找到(此处),我需要Spring 3.1.2,因为之前的版本不支持Jackson 2。

所以,经过这一切......我仍然得到了相同的异常。我的Maven依赖确实包括Spring MVC 3.1.2版本以及Jackson的2个jar(它们都在我的build路径中)。


    
        com.fasterxml.jackson.core
        jackson-databind
        2.2.2
    
    
        com.fasterxml.jackson.core
        jackson-annotations
        2.2.2
    
    
        com.fasterxml.jackson.core
        jackson-core
        2.2.2
    

这是我的控制器方法尝试发送一个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年之前发布的(Jackson 2发布的那一年5月)

admin 更改状态以发布 2023年5月22日
0
0 Comments

好的,我弄清楚了。

首先,正如我所怀疑的那样,Spring MVC没有调用Jackson来序列化实体。正如我在这里找到的那样,我需要修改mvc:annotation-driven


    
        
    

这样做后,我又遇到了Direct self-reference exception的问题......于是在我花了一个小时的时间查找后,我最终发现我‘只需要’在一些类中添加一个注释。

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

这个注释的意思是,如果某个对象在序列化器中重复出现,它将被序列化一次,然后只会被序列化器创建的@id引用。

0