如何利用javax.validation让异常输出@NotNull注解的自定义提示信息?
解决javax.validation输出自定义非空提示的问题
你现在的问题核心是id使用了int基本数据类型,它无法存储null值,JSON转对象时遇到null直接抛出NullPointerException,导致@NotNull注解根本没机会执行校验。要实现你需要的自定义错误提示,按以下步骤修改:
1. 修改Emp类的id类型为Integer
int是基本类型,默认值为0,无法接收null,JSON解析工具遇到null赋值给int时直接抛NPE,@NotNull注解完全起不了作用。改成包装类型Integer后,才能让null值被正常赋值,进而触发校验逻辑。
修改后的Emp类代码:
class Emp{ @NotNull(message="id should not be null") private Integer id; // 将int改为Integer @NotNull(message="name should not be null") private String name; // getter、setter 保持不变 }
2. 手动触发javax.validation的校验
JSON转换工具仅负责对象转换,不会自动执行javax.validation校验。转换完成后,需要手动获取Validator实例,对对象进行校验并处理结果。
修改后的MyActionClass代码:
import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import javax.validation.ConstraintViolation; import java.util.Set; class MyActionClass{ public void getRequestForm(String inputJsonString){ // 建议将ValidatorFactory和Validator设为全局单例,避免重复创建浪费资源 ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); try{ Emp empInput = MyConvertClass.jsonToObject(inputJsonString); // 执行校验 Set<ConstraintViolation<Emp>> violations = validator.validate(empInput); if(!violations.isEmpty()){ // 遍历输出所有校验错误信息 for(ConstraintViolation<Emp> violation : violations){ System.out.println(violation.getMessage()); } } } catch(Exception e){ // 捕获JSON格式错误等转换异常 System.out.println(e.getMessage()); } } }
补充说明
- 若项目基于Spring框架,可直接注入
Validator实例,无需手动创建,校验逻辑一致。 - ValidatorFactory属于重量级对象,建议全局只初始化一次,不要在每次方法调用时创建。
- 完成上述修改后,当JSON中id为null时会输出"id should not be null",name为null时输出"name should not be null",不会再抛出NullPointerException。
内容的提问来源于stack exchange,提问作者MMMMS
相关产品推荐
相关产品推荐

