Spring3.0.5中@Valid与@RequestBody配合失效问题排查求助
Spring3.0.5中@Valid与@RequestBody配合校验失效问题排查
问题现象
使用@Valid注解配合@RequestBody接收JSON参数时,实体类的@NotNull约束未生效:发送缺少userId字段的请求({"firstName":"abc","lastName": "xyz","companyName":"abc Corp"}),控制器返回成功响应,未触发校验失败逻辑。
核心原因及解决办法
1. Spring3.0.x对@RequestBody参数校验的原生支持不足
Spring 3.0版本的MVC模块,默认不会对@RequestBody绑定的参数自动执行@Valid校验,必须显式配置校验器并关联到RequestMapping处理器。
解决配置:
在Spring MVC的XML配置文件中添加以下内容:
<!-- 开启注解驱动,并指定校验器 --> <mvc:annotation-driven validator="validator"/> <!-- 配置Hibernate Validator作为校验实现 --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean>
2. 控制器方法需添加BindingResult接收校验结果
即使配置了校验器,若控制器方法未声明BindingResult参数,Spring会直接抛出MethodArgumentNotValidException异常而非返回校验失败信息。若需要自定义响应逻辑,需补充参数:
@RequestMapping(value = "/ValidateCustomer", method = RequestMethod.POST, headers="content-type=application/json") @ResponseBody public String validateCustomer(@Valid @RequestBody Customer customer, BindingResult bindingResult) throws Exception { if (bindingResult.hasErrors()) { // 处理校验失败逻辑,比如返回错误信息 return "Validation Failed: " + bindingResult.getAllErrors(); } // 正常业务处理 return "Validated"; }
3. 检查依赖冲突
确保项目中没有引入多个版本的validation-api或hibernate-validator,可通过mvn dependency:tree命令排查依赖树,剔除冲突的依赖包。
4. 确认Jackson解析行为
Jackson默认会将JSON中未提供的字段解析为null,符合@NotNull的校验触发条件。若你的Jackson配置被修改(比如设置了特殊的字段解析规则),需确认字段能被正确解析为null。
内容的提问来源于stack exchange,提问作者user3454638
相关产品推荐
相关产品推荐

