自动配置Validation
当应用中的Classpath下存在
javax.validation
的实现时,Spring Boot的
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
将会自动配置用于validate的
LocalValidatorFactoryBean
,前提是在用户没有自己定义
javax.validation.Validator
类型的bean的情况下,
LocalValidatorFactoryBean
也是实现了
javax.validation.Validator
接口的。此外,在缺少
org.springframework.validation.beanvalidation.MethodValidationPostProcessor
类型的bean的情况下还会自动配置一个
org.springframework.validation.beanvalidation.MethodValidationPostProcessor
类型的bean。它允许我们在bean的方法参数或方法上添加JSR303标准的Validation注解,从而在进行bean的方法调用时可以对方法参数或方法的返回值进行有效性验证。需要对bean的方法调用进行有效性校验需要在bean对应的Class上添加org.springframework.validation.annotation.Validated注解。假设应用中拥有如下这样一个bean定义,可以看到notNull方法的参数上添加了
@NotNull
,即不允许传递的参数为null;notBlank方法的参数上添加了
@NotBlank
,即不允许传递的参数为null或空字符串;returnPositive方法上添加了
@Positive
,即返回值只允许返回正数。
@Service
@Validated
public class ValidationTestService {
public void notNull(@NotNull Integer num) {
}
public void notBlank(@NotBlank String str) {
}
@Positive
public int returnPositive(int num) {
return num;
}
}
更多的JSR303注解的应用请参考对应的API文档。
进行单元测试如下,你会发现
testNotNull()
将失败,而
testNotNull2()
将成功;
testNotBlank()
和
testNotBlank1()
testNotBlank2()
testReturnPositive()
将成功,而
testReturnPositive2()
将失败。
@SpringBootTest(classes=Application.class)
@RunWith(SpringRunner.class)
public class ValidationServiceTest {
@Autowired
private ValidationTestService validationTestService;
@Test
public void testNotNull() {
Integer num = null;
this.validationTestService.notNull(num);
}
@Test
public void testNotNull2() {
Integer num = 1;
this.validationTestService.notNull(num);
}
@Test
public void testNotBlank() {
String str = null;
this.validationTestService.notBlank(str);
}
@Test
public void testNotBlank2() {
String str = "";
this.validationTestService.notBlank(str);
}
@Test
public void testNotBlank3() {
String str = "A";
this.validationTestService.notBlank(str);
}
@Test
public void testReturnPositive() {
int num = 1;
this.validationTestService.returnPositive(num);
}
@Test
public void testReturnPositive2() {
int num = -1;
this.validationTestService.returnPositive(num);
}
}
(注:本文是基于Spring Boot 2.0.3所写)