参考资料:
1、https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/
2、https://blog.csdn.net/neweastsun/article/details/78509977 (这位老哥的博客非常给力)
常见的表单校验触发是下面这种方式:
@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>
如果是springboot项目或者引入了tomcat容器中的jar包:
里面就包含了下面这个依赖,不需要依赖:javax.el:el-api:2.2
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.13</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"