当我在进行AJAX调用时向我的请求添加servlet映射(.htm)时,为什么控制器方法不返回Object

时间:2014-04-09 06:31:49

标签: ajax json spring web.xml

我正在从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,所以我无法重现它。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 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执行此操作。