上篇文章说javax.validation
包与hibernate-validator
包中注解能解决80%的问题,那剩下20%的问题咋解决?
答案是自定义注解来解决
我们在工作中经常需要对日期格式进行定义,如果客户端传来的日期字符串不符合要求,那么根本无法保存,但是已有的注解并没有日期格式的验证,那我们就自己实现一个
一、自定义日期格式验证的注解@DateFormat
注解里需要写明用来具体处理验证逻辑的类,这里对应的就是DateFormatValidator.class
@Target({ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = DateFormatValidator.class) public @interface DateFormat { String message() default "日期格式错误"; String format() default "yyyy-MM-dd"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
二、验证逻辑处理类
public class DateFormatValidator implements ConstraintValidator<DateFormat, String> { private DateFormat dateFormat; @Override public void initialize(DateFormat dateFormat) { this.dateFormat = dateFormat; } @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { String format = dateFormat.format(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { simpleDateFormat.parse(s); } catch (Exception e) { return false; } return true; } }
三、自定义注解的应用
public class Tables implements Serializable { private static final long serialVersionUID = -3596411984380984035L; @ApiModelProperty("表名,必须为英文小写") @NotNull(message = "tbName不能为空") private String tbName; @ApiModelProperty("表描述") @NotNull(message = "chineseName不能为空") private String chineseName; @ApiModelProperty("表唯一键") private String uniqueKey; @ApiModelProperty("创建日期") @DateFormat(format = "yyyy-MM-dd",message = "日期格式错误,正确格式为yyyy-MM-dd") private String createDate; }
四、controller层的使用
@PostMapping("addTable") @ApiOperation("增加一个表") public BaseResponse<String> addTable(@Validated @RequestBody Tables tables, BindingResult br) { if (br.hasErrors()) { String defaultMessage = br.getFieldError().getDefaultMessage(); return BaseResultUtils.error(defaultMessage); } else { modelService.createTB(tables); return BaseResultUtils.success(null); } }
五、最终效果