javaBean校驗-Validator、@Valid

參考資料:

1、https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/

2、https://blog.csdn.net/neweastsun/article/details/78509977  (這位老哥的博客非常給力

3、Springboot 表單數據校驗

4、spring-自定義校驗註解

常見的表單校驗觸發是下面這種方式:

    @PostMapping("/user")
    public JSONObject User(@Valid User user,BindingResult bindingResult){
        JSONObject json = new JSONObject();
        if(bindingResult.hasErrors()){
            json.put("errorCode","9999");//表示失敗
            json.put("errorMsg",bindingResult.getFieldError().getDefaultMessage());
            return json;
        }
        json.put("errorCode","0000");//表示成功
        return json;
    }

那如果在非web項目中,怎麼觸發?

1、引入依賴

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.1.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
            <version>2.2</version>
        </dependency>

2、實例1- User

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
 * Created by yanshao on 2018/12/11.
 */

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User{
    @Valid
    @NotNull(message = "部門不能爲空")
    private Department department;
    @NotNull(message = "姓名不能爲空")
    private String name;
    @NotNull(message = "性別不能爲空")
    private String gender;
    private int age;
    private String address;
    private String familly;

}

注意:如果bean裏面還包含另外一個bean,對於這種嵌套校驗,需要在嵌套的bean上加@Valid註解

2、實例2-Department

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

/**
 * Created by yanshao on 2018/12/11.
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Department {
    @NotNull(message = "部門名稱不能爲空")
    private String departName;
    @NotNull(message = "部門編號不能爲空")
    private Integer departNo;
}

3、測試案例-ValidTest

import javax.validation.*;
import java.text.ParseException;
import java.util.Set;

/**
 * Created by yanshao on 2018/12/11.
 */
public class ValidTest {
    //默認獲取ValidatorFactory實例
    private static Validator validator = Validation.buildDefaultValidatorFactory()
            .getValidator();

    public static void main(String[] args) throws ParseException {

        Object user = User.builder()
                .name("yanshao")
                .gender("男")
                .department(new Department())
                .build();

        Set<ConstraintViolation<Object>> violations = validator.validate(user);
        printValidMessage(violations);
    }
    public static void printValidMessage(Set<ConstraintViolation<Object>> violations){
        if (violations.size() == 0) {
            System.out.println("校驗通過");
        } else {
            System.out.println("校驗失敗: ");
            violations.stream().forEach(userConstraintViolation -> {
                System.out.println(userConstraintViolation.getMessage());
            });
        }
    }

    /**
     * 這裏可以做擴展,可以實現自己的校驗規則
     * 獲取ValidatorFactory實例
     * */
    public static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }

}

記得依賴:javax.el : el-api

java.lang.ExceptionInInitializerError
Caused by: javax.validation.ValidationException: Unable to instantiate Configuration.
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:279)
	at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
	at ValidTest.<clinit>(ValidTest.java:10)
Caused by: javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:172)
	at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:118)
	at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:110)
	at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:86)
	at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41)
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276)
	... 2 more
Exception in thread "main"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章