springMVC基於hibernate validator的表單統一校驗
具體實現: 1、本測試專案採用maven工程。在pom.xml檔案中增加對validator.jar依賴的引入 由於這個專案是分散式的 所以我在parent專案的pom檔案中新增jar包
<properties> <version-hibernate-validate>5.4.0.Final</version-hibernate-validate> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${version-hibernate-validate}</version> </dependency> </dependencies> </dependencyManagement>
2.配置是spring-mvc.xml(resource裡面)
<!-- validation --> <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> <!-- 國際化配置 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="useCodeAsDefaultMessage" value="true" /> </bean> <!-- 註冊驗證器 --> <mvc:annotation-driven validator="validator" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> <!-- 這裡配置將使用上面國際化配置的messageSource --> <property name="validationMessageSource" ref="messageSource" /> </bean>
3.建立統一處理 這個我是寫在BaseExceptionController裡面的,分銷商controller裡面的一個類用來捕獲各種異常。(有點像工具類一樣,個人理解)
@ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public BaseResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { logger.error("引數驗證失敗", e); BindingResult result = e.getBindingResult(); BaseResponse baseResponse = new BaseResponse(); // 取第一條返回 for (ObjectError error : result.getAllErrors()) { String code = error.getCode(); String message = error.getDefaultMessage(); String description = String.format("%s:%s", code, message); baseResponse.setData("400"); baseResponse.setSuccess(false); baseResponse.setMsg(description); break; } return baseResponse; }
補充: HttpStatus.BAD_REQUEST:表示報400. @ExceptionHandler:統一處理某一類異常,從而能夠減少程式碼重複率和複雜度 我們介面規範要求返回baseResponse(data,message,success)
4.在vo上面加上註解 vo和實體類是不同的(單一職責)
public class UserVO {
@NotEmpty(message="姓名不能為空")
private String name;
@Range(min=20,max=120,message="年齡在20到120歲之間")
private int age;
@NotEmpty(message="地址不能為空")
private String address;
... getter
... setter
}
5.測試controller
@Controller
@RequestMapping(value = "/operation/hello")
public class HelloController {
public static final Logger LOG = LoggerFactory.getLogger(HelloController.class);
@RequestMapping(value = "/testValidUser", method = RequestMethod.POST)
@ResponseBody
public String testValidUser(@RequestBody @Valid UserVO userVO){
return CommonResult.success(userVO).toJSON();
}
}
6.測試結果 假設前端傳的body是這樣的
{
"name":"",
"age":130,
"address":""
}
介面返回的結果是:
{
"data": [
"年齡在20到120歲之間",
"姓名不能為空",
"地址不能為空"
],
"message": "引數不合法",
"success": false
}
補充: / * Bean Validation 中內建的 constraint * * @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 附加的 constraint * * @NotBlank(message =) 驗證字串非null,且長度必須大於0 * @Email 被註釋的元素必須是電子郵箱地址 * @Length(min=,max=) 被註釋的字串的大小必須在指定的範圍內 * @NotEmpty 被註釋的字串的必須非空 * @Range(min=,max=,message=) 被註釋的元素必須在合適的範圍內 */ **