Spring Boot(15)——自动配置Validation

自动配置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;
}


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
更多的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);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(注:本文是基于Spring Boot 2.0.3所写)
---------------------