Spring MVC中的错误406 - 从Spring 3.0.5迁移到Spring 4.2.4

时间:2016-02-24 15:18:20

标签: java spring maven spring-mvc jackson

我正在将Web应用程序从Spring 3.0.5迁移到4.2.4。经过许多障碍(显然这个过程并没有真正记录好......),我已经遇到了可怕的406错误。似乎周围有很多问题,但没有一个答案是有效的(甚至是可疑的答案)。

这是具有以下功能的控制器代码:

<input type=number min=0 max=23 value=0 />

第一个函数按预期返回@Controller public class TestController { @RequestMapping(value = "/echo", method = RequestMethod.GET, headers = "Accept=*/*") @ResponseBody public String echoReply(HttpServletRequest request) throws Exception { return "echo"; } @RequestMapping(value = "/test", method = RequestMethod.GET, headers = "Accept=*/*") @ResponseBody public boolean testFunc(HttpServletRequest request) throws Exception { ... return ...; } ,但测试函数返回错误406 - echo。确切的信息是:

Could not find acceptable representation

两者都与AJAX调用相关,也可以通过URL直接访问。

任何想法要寻找什么以及为什么会这样发生?

编辑:也许这是控制器类注释中的一些问题(应该在Spring 4.2中缺少的东西)?

应用-context.xml中

The resource identified by this request is only capable of generating
responses with characteristics not acceptable according to the request
"accept" headers

的pom.xml : (杰克逊的相关依赖)

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"

   xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop.xsd" default-lazy-init="true">

    <context:annotation-config />
    <aop:aspectj-autoproxy />
    <tx:annotation-driven/>
    <mvc:annotation-driven/>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
       <property name="persistenceUnitName" value="..." />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>

    // bunch of component-scans and some more beans

</beans>

2 个答案:

答案 0 :(得分:1)

official Spring MVC documentation将以下数据类型列为控制器方法的有效返回类型:

  • ModelAndView
  • Model
  • Map
  • View
  • String
  • void
  • HttpEntity
  • HttpHeaders
  • Callable
  • DeferredResult
  • ListenableFuture
  • ResponseBodyEmitter
  • SseEmitter
  • StreamingResponseBody

对于使用@ResponseBody注释的控制器方法,返回类型将写入响应主体。此过程使用适用于HttpMessageConverter请求标头的Accepts执行。

由于您的testFunc方法的返回类型为boolean,因此Spring MVC将尝试使用HttpMessageConverter写入返回的值。这意味着,Accepts标头必须指定一个值,该值将导致boolean值的有效表示。因此,表示只能是无模式的,例如JSON。任何其他表示都会导致所描述的错误。

因此,如果您的Accepts标头设置为text/htmlapplication/xml,则boolean将无法写入响应正文。但是,如果您将标题设置为application/json,则您的boolean值将被正确写入。

如果您还想支持HTML和XML,则必须将boolean包装在Map或自定义对象等对象中。

答案 1 :(得分:0)

尝试使用

更新app-context.xml
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>