service层方法校验:@Validated,@NotNull,@Valid

1.目的:

解决入参校验问题

简化代码

2.依赖:

(1).javax-validation (接口)

(2).hibernate-validator(实现)


    javax.validation
    validation-api
    2.0.1.Final



    org.hibernate.validator
    hibernate-validator
    6.0.12.Final

3..例子代码:

TestService.java

import javax.validation.constraints.NotNull;
public interface TestService {
    String test1(@NotNull Integer id);
}

TestServiceImpl.java

import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@Service
@Validated
public class TestServiceImpl implements TestService {

    @Override
    public String test1(Integer aa) {
        return "haha";
    }
}

4.问题:

@Validated和@NotNull加到什么上面,接口还是实现?用上面的例子进行测

不同情况 TestService TestServiceImpl 结果 结果测试图
1

@Validated √

@NotNull √

@Validated ×

@NotNull ×

可以校验

javax.validation.ConstraintViolationException: test1.arg0: 不能为null

 

2

@Validated √

@NotNull ×

@Validated ×

@NotNull √

不行

javax.validation.ConstraintDeclarationException: HV000151: A method overriding another method must not redefine the parameter constraint configuration, but method TestServiceImpl#test1(Integer) redefines the configuration of TestService#test1(Integer).

非法约束限定,必须要在接口上限制

3

@Validated √

@NotNull √

@Validated ×

@NotNull √

可以校验

javax.validation.ConstraintViolationException: test1.arg0: 不能为null, test1.aa: 不能为null

先校验接口,后校验实现

4

@Validated ×

@NotNull ×

@Validated √

@NotNull √

不行 javax.validation.ConstraintDeclarationException: HV000151: A method overriding another method must not redefine the parameter constraint configuration, but method TestAServiceImpl#test1(Integer) redefines the configuration of TestService#test1(Integer).
5

@Validated ×

@NotNull √

@Validated √

@NotNull √

可以校验

javax.validation.ConstraintViolationException: test1.aa: 不能为null, test1.arg0: 不能为null

先校验了实现,后校验接口

6

@Validated ×

@NotNull √

@Validated √

@NotNull ×

可以校验 javax.validation.ConstraintViolationException: test1.arg0: 不能为null

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

可以发现,@NotNull加到接口,@Validated加到实现或者接口都可以

那么,@Validated加到哪里比较好呢?

放到实现上的原因:

(1).更灵活,如果一个接口多个实现的话,需要校验的实现可以对其进行校验,不需要校验的就不用校验参数

(2).避免坑,如果实现和接口是在不同的maven项目下,接口就可以不用引用hibernate-validator这个包,避免包冲突的坑

(3).更符合规范,接口是定义方法的规范,@Validated是实现校验,应该放到实现中

综上,@Validated放到实现上,@NotNull,@Valid等声明放到接口上

那么,spring 校验和 hibernate校验有什么区别呢????下次看

 

你可能感兴趣的:(java开发碰到的问题)