上篇文章說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(); if (format.equals("yyyy-MM")) { DateTimeFormatter dtf1 = new DateTimeFormatterBuilder() .appendPattern(format) .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) .toFormatter(); try { LocalDate.parse(s, dtf1); } catch (Exception e) { return false; } } else { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { simpleDateFormat.parse(s); } catch (Exception e) { return false; } } return true; } }
這個月數據yyyy-MM需要特殊處理的原因在於,如果提供的是yyyy-MM-dd的格式的字符串,使用SimpleDateFormat("yyyy-MM")去解析也不會失敗
三、自定義注解的應用
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); } }
五、最終效果
參考:
https://blog.csdn.net/qq_40775879/article/details/86302695
https://www.jianshu.com/p/67d3637493c7