Spring MVC在发送比预期更多的JSON时返回HTTP 400

ege*_*ari 1 java ajax spring json spring-mvc

目前我正在开发一个ajax应用程序,它通过JSON将HTTP PUT请求发送到Spring 3.2 MVC控制器.

一切正常,除了你的JSON数据与预期的@RequestBody类完全不匹配的情况:

@RequestMapping(value = "/{companyId}", method = RequestMethod.PUT)
public void update(@PathVariable long companyId, @Valid @RequestBody AdminCompanyForm adminCompanyForm) {
    adminCompanyService.updateCompany(companyId, adminCompanyForm);
}
Run Code Online (Sandbox Code Playgroud)

例如,假设我们发送的是包含idname字段的JSON对象,但@RequestBody对象只包含一个名为的字段name.

在这种情况下,Spring MVC将发送HTTP 400响应代码(即错误请求),而不会出现任何其他形式的错误消息.解决方案是更改我们的Javascript代码,以便JSON数据只包含一个name字段.这样做,一切都很完美.

我的问题是:当我的一个控制器上的HTTP PUT操作发送太多JSON时,如何告诉Spring不发送HTTP 400错误?当id通过JSON发送额外字段时,我希望Spring简单地忽略它.我不希望它太严格.必须手动删除JSON字段以匹配服务器所期望的完全是非常耗时的,并且我希望让我的生活更轻松.

有没有办法实现我想要的?

谢谢!

Yug*_*hou 5

配置对象映射器,

ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY);
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)

您可以使用此对象映射器编写一个简单的测试用例.它将忽略未记录的字段.

现在我们需要配置spring mvc来使用这个自定义对象映射器.你可以写一个工厂bean返回ObjectMapper:

<mvc:annotation-driven>
<mvc:message-converters>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="objectMapper" ref="jacksonObjectMapper" />
    </bean>        
</mvc:message-converters>
</mvc:annotation-driven>

 <bean id="jacksonObjectMapper" class="yourCustomObjectMapper" />
Run Code Online (Sandbox Code Playgroud)