天天看点

Spring Boot(15)——自动配置Validation自动配置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;
    }
    
    
}           
更多的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所写)