介紹
首先說下大家常用的hibernate-validator,它是對JSR-303/JSR-349標準的實現,然後spring爲了給開發者提供便捷集成了hibernate-validator
,默認在springmvc模塊。
依賴
本文所介紹皆在springboot應用的基礎上,首先加上web模塊:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
可以查看其子依賴,發現web模塊默認使用了hibernate-validator:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
對實體類添加校驗
public class AgentTrustor implements Serializable,UniqueVerifiableVO {
private static final long serialVersionUID = 4095871718305603749L;
/**
* 主鍵ID
*/
@Id
@ApiModelProperty(value="主鍵ID", required = true)
private Integer fid;
/**
* 代理人代碼
*/
@Length(min = 3,message = "代理人代碼位數至少三位")
@Column(name = "ftrustor_id")
@ApiModelProperty(value="代理人代碼", required = true)
private String ftrustorId;
/**
* 聯繫人郵箱
*/
@Email(message = "郵箱格式錯誤")
@Column(name = "femail")
@ApiModelProperty(value="聯繫人郵箱", required = true)
private String femail;
}
通過註釋名即可推斷出校驗的內容,message用作校驗失敗時的提示信息。
對Rest層添加校驗
@ApiOperation(value="新增", notes="")
@PostMapping(value = "")
//@Transactional(rollbackFor=Exception.class)
public ObjectRestResponse<AgentTrustor> add(@RequestBody @Validated AgentTrustor agentTrustor) throws BaseException{
agentTrustorBiz.bizInsertSelective(agentTrustor);
return new ObjectRestResponse<AgentTrustor>().rel(true);
}
統一異常的處理
經過對校驗異常的debug發現,該異常爲MethodArgumentNotValidException
:
可以看到該異常對象的結構,同樣我們可以根據其結構解析出想要的結果:
@ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResponse validExceptionHandler(HttpServletResponse response, MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
StringBuffer stringBuffer = new StringBuffer();
if(bindingResult.hasErrors()){
for (FieldError fieldError : bindingResult.getFieldErrors()) {
//該格式僅僅作爲response展示和log作用,前端應自己做校驗
stringBuffer.append(fieldError.getObjectName() + "--" + fieldError.getDefaultMessage() + " ");
}
}
logger.error(stringBuffer.toString());
return new BaseResponse(HttpStatus.BAD_REQUEST.value(),stringBuffer.toString());
}
上面代碼是統一異常處理中的一部分,主要是用來處理參數校驗產生的MethodArgumentNotValidException
異常。
分組校驗
當我們遇到不同場景需要有不同的校驗規則時候,我們可以使用分組校驗。如:一個請求只校驗id,一個請求只校驗email:
public class AgentTrustor implements Serializable,UniqueVerifiableVO {
private static final long serialVersionUID = 4095871718305603749L;
/**
* 主鍵ID
*/
@Id
@ApiModelProperty(value="主鍵ID", required = true)
private Integer fid;
/**
* 代理人代碼
*/
@Length(min = 3,message = "代理人代碼位數至少三位",groups = {ID.class})
@Column(name = "ftrustor_id")
@ApiModelProperty(value="代理人代碼", required = true)
private String ftrustorId;
/**
* 聯繫人郵箱
*/
@Email(message = "郵箱格式錯誤",groups = {EMAIL.class})
@Column(name = "femail")
@ApiModelProperty(value="聯繫人郵箱", required = true)
private String femail;
public interface ID{};
public interface EMAIL{};
}
根據需要在@Validated屬性中指定需要校驗的分組名,可以指定1到多個。指定到的分組名會全部進行校驗,不指定的不校驗
@ApiOperation(value="新增", notes="")
@PostMapping(value = "")
//@Transactional(rollbackFor=Exception.class)
public ObjectRestResponse<AgentTrustor> add(@RequestBody @Validated(AgentTrustor.ID.class) AgentTrustor agentTrustor) throws BaseException{
agentTrustorBiz.bizInsertSelective(agentTrustor);
return new ObjectRestResponse<AgentTrustor>().rel(true);
}
API
JSR提供的校驗註解
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max=, min=) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期
@Pattern(regex=,flag=) 被註釋的元素必須符合指定的正則表達式
Hibernate Validator提供的校驗註解
@NotBlank(message =) 驗證字符串非null,且長度必須大於0
@Email 被註釋的元素必須是電子郵箱地址
@Length(min=,max=) 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range(min=,max=,message=) 被註釋的元素必須在合適的範圍內