1. 程式人生 > >springMVC基於hibernate validator的表單統一校驗

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=) 被註釋的元素必須在合適的範圍內 */ **