參考資料:
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>
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"