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"

 

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