我正在将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>
答案 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/html
或application/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>