我正在从javascript到我的控制器进行ajax调用并返回一个Object。
我从ajax发送Json
并通过@RequestBody
在控制器中检索,并使用Json
从控制器发送@ResponseBody
。
我的功能完全正常,直到我必须在请求映射中添加.htm。
现在,当我返回相同的Object时,它会抛出HttpMediaTypeNotAcceptableException
(返回只是String,即使使用.htm也是如此)。
这是我来自js的ajax调用:
var user = new Object();
user.id = 1;
user.name = "Noor";
$.ajax(contextPath + "/createUser.htm", {
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(user),
success: function(result) {
alert("Success");
},
error: function(jqXHR, textStatus, errorThrown) {
alert("Fail");
}
});
这是我的控制者:
@RequestMapping(value = "/createUser.htm", method = RequestMethod.POST)
@ResponseBody
public ResultDTO createUser(@Valid @RequestBody CitizenUser user){
log.info("Enter Controller");
..
..
..
log.infor("Exit");
return new User(100,"DADA");
}
在没有映射的.htm的情况下,这完全正常。
但是我的项目在映射中需要.htm,所以我无法重现它。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
用
dataType: 'json',
您指定在响应中返回JSON。您有效地将请求Accept
标头设置为
Accept: application/json
因此,您的网络应用程序只能回复application/json
个内容。如果没有.htm
扩展名,则无法限制服务器端生成的响应,因此所有类型都可以生成,但只有Jackson HttpMessageConverter
生成application/json
,因此将使用一个。{1}}。
使用.htm
扩展程序,您还会进行内容协商。这基本上决定了服务器应该生成什么,即使它是不可接受的。这就是为什么你得到一个
HttpMediaTypeNotAcceptableException
。如果您无法摆脱扩展,请查看ContentNegotiationConfigurer
以配置内容协商。
另见
答案 1 :(得分:0)
在确定支持哪种媒体类型时,文件扩展优先于接受标头。
您的.htm
会强制text/html
而不是application/json
。要禁用此功能,您必须自己配置ContentNegotiationManager
并禁用文件扩展名。
如果您使用xml,则可以使用ContentNegotiationManagerFactoryBean
对其进行配置,并将其作为对<mvc:annotation-driven />
标记的引用传递。
<bean id="contentNegotiationManager" class=" org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
使用Java Config时,您可以使用ContentNegotiationConfigurer
执行此操作。