Spring4.3.1+Java1.8环境@Email校验报HV000030错误求助
解决Spring应用邮箱校验报错问题
问题背景
运行在Java 1.8_431上的Spring 4.3.1.RELEASE应用,使用@Email注解校验邮箱字段时,服务器返回500错误,日志报错:
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email' validating type 'java.lang.String'. Check configuration for 'email'
核心原因
- 版本不兼容:Spring 4.3.x仅支持Bean Validation 1.1(JSR-349)规范,但当前使用的
validation-api:2.0.1.Final是Bean Validation 2.0(JSR-380),hibernate-validator:6.1.1.Final是对应JSR-380的实现,两者和Spring 4.3不兼容,导致校验器无法被Spring正确识别。 - 注解混用错误:GET请求中同时使用
@ModelAttribute和@RequestBody不合理,@RequestBody用于解析POST请求的JSON/XML请求体,GET请求无请求体,会导致参数绑定异常,间接干扰校验流程。
解决方案
1. 调整依赖至兼容版本
修改POM中的校验依赖,替换为Spring 4.3支持的组合:
<!-- Bean Validation 1.1 API(适配Spring 4.3) --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <!-- Hibernate Validator 5.x是JSR-349的实现,与Spring 4.3兼容 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.3.Final</version> </dependency> <!-- EL依赖保持3.0.0,适配Hibernate Validator 5.x --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version> </dependency>
2. 修正控制器注解
移除GET请求中的@RequestBody,GET请求通过URL/表单参数传递数据,@ModelAttribute已足够完成参数绑定:
@Controller @RequestMapping("/reg") public class RegController { @RequestMapping(value = "/index", method = RequestMethod.GET) public String index(@ModelAttribute("regForm") @Valid RegForm regForm, BindingResult result, Model model, final RedirectAttributes redirectAttributes, HttpServletRequest req) throws AcceleratoreException { // 先处理校验错误 if(result.hasErrors()){ return "reg/index"; // 返回表单页面展示错误 } // 正常业务逻辑 ...... } }
3. 校验逻辑规范
确保BindingResult对象紧跟在@Valid注解的参数之后,这样Spring会将校验错误存入BindingResult,而非直接抛出异常导致500错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

