SpringBoot-服務端參數驗證-JSR-303驗證框架


1. springboot 默認集成了 hibernate-validator,它默認是生效的,可以直接使用。

比如:

@RestController
@RequestMapping("/hibernate")
public class DefaultHibernateValidatorTestController {

    /**
     * Springboot 默認會驗證 controller 層的 validator,使用的是默認實現 hibernate-validator。
     * 但是 hibernate-validator 只能對Object類型的屬性進行校驗,不能對單個的參數進行校驗。下面的校驗不生效
     * @param str
     * @return
     */
    @RequestMapping("/string")
    public OpResponse valiateString(@NotEmpty(message = "str不能為空") String str){
        return OpResponse.suc(str);
    }

    /**
     * 檢驗生效
     * @param foo
     * @return
     */
    @RequestMapping("/foo")
    public OpResponse valiateString(@Valid @NotNull Foo foo){
        return OpResponse.suc(foo);
    }

    static class Foo implements Serializable {
        @NotNull
        private Integer id;
        @NotEmpty
        private String name;
        ........
    }
}

 

2. hibernate-validator不支持基礎類型的驗證,springboot對其進行了擴展,添加了MethodValidationPostProcessor攔截器,可以實現對方法參數的校驗。

例如:

/**
 * 對基礎類型的驗證,必須要在Controller類上加 @Validated,同時配置 MethodValidationPostProcessor 才生效
 * <pre>
 *     @Bean
 *     public MethodValidationPostProcessor methodValidationPostProcessor() {
 *         return new MethodValidationPostProcessor();
 *     }
 * </pre>
 * @link https://yezhwi.github.io/springboot/2017/11/17/SpringBoot-服務端參數驗證-JSR-303驗證框架
 * Created by wangzhiyuan on 2018/8/20
 */
@RestController
@RequestMapping("/validate")
@Validated public class ValidatorTestController {
    @Resource
    BizService bizService;


    @RequestMapping("/string")  // 這個 @NotEmpty 是生效的 public OpResponse valiateString(@NotEmpty(message = "str不能為空") String str){
        bizService.validateTest(str);
        return OpResponse.suc(str);
    }


    /**
     * 可以看出,springboot默認只會驗證 controller 方法上的 validator 注解,而不會驗證 controller 層以外的。所以,如果要在其他層使用 validator 驗證的話,需要單獨配置攔截器
     * @return
     */
    @RequestMapping("/blank")
    public OpResponse blank(){
        String str = null;
        bizService.validateTest(str);
        bizService.validateFooTest(null);
        return OpResponse.suc(str);
    }

}

 

3. springboot默認只會驗證 controller 方法上的 validator 注解,而不會驗證 controller 層以外的。所以,如果要在其他層使用 validator 驗證的話,需要單獨配置攔截器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM