说明:Validation 在Controller层使用Validation应该都使用过了,以下方式可以使用 Validation 在Service层完成对dto的属性校验,避免写一堆的 if else 来处理这些逻辑,提高开发效率,代码如下:
1:DTO实体类代
@Data public class AddUserParamsDto implements Serializable { private Integer id; @NotEmpty(message = "用户名不能为空") private String username; @Length(min = 6, message = "密码长度不能小于6") private String password; @Max(value = 120, message = "年龄必须在18-120之间") @Min(value = 18, message = "年龄必须在18-120之间") private Integer age; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date birthday; private String description; }
2:可以将ValidatorFactory的创建放入配置类里,后期如果使用 Validation 可以直接使用Spring的IOC进行注入,实现代码重用性。
@Configuration public class ValidatorConfigBean { @Bean public ValidatorFactory validatorFactory() { return Validation.byProvider(HibernateValidator.class) .configure() .failFast(false) .buildValidatorFactory(); } @Bean public Validator validator(ValidatorFactory validatorFactory) { return validatorFactory.getValidator(); } }
3:Controller层测试接口
@RestController public class UserController { @Resource private UserService userService; @GetMapping("/test/valid") public Object validToService() { AddUserParamsDto dto = new AddUserParamsDto(); dto.setUsername(null); dto.setAge(200); dto.setPassword("123"); return userService.validToService(dto); } }
4:Service层代码,可以注入ValidatorFactory手动创建Validator对象,也可直接注入Validator对象
@Service public class UserServiceImpl implements UserService { @Resource private Validator validator; @Override public Object validToService(AddUserParamsDto dto) { List<String> list = new ArrayList<>(); Set<ConstraintViolation<AddUserParamsDto>> violations = validator.validate(dto); for (ConstraintViolation<AddUserParamsDto> violation : violations) { list.add(violation.getMessage()); } return list; } }