手动调用弹簧注释验证

2022-08-31 15:48:40

我正在用Hibernate和Spring Annotations做很多验证,如下所示:

public class Account {
    @NotEmpty(groups = {Step1.class, Step2.class})
    private String name;

    @NotNull(groups = {Step2.class})
    private Long accountNumber;

    public interface Step1{}
    public interface Step2{}
}

然后在控制器中,它在参数中被调用:

public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
   //some more code and stuff here
   return "";
}

但我想根据控制器方法中的一些逻辑来决定使用的组。有没有办法手动调用验证?类似的东西 ?result = account.validate(Account.Step1.class)

我知道创建自己的 Validator 类,但这是我想避免的事情,我宁愿只使用类变量本身的注释。


答案 1

Spring提供了LocalValidatorFactoryBean,它实现了Spring SmartValidator接口以及Java Bean Validation Validator接口。

// org.springframework.validation.SmartValidator - implemented by LocalValidatorFactoryBean
@Autowired
SmartValidator validator;

public String saveAccount(@ModelAttribute Account account, BindingResult result) {
    // ... custom logic
    validator.validate(account, result, Account.Step1.class);
    if (result.hasErrors()) {
        // ... on binding or validation errors
    } else {
        // ... on no errors
    }
    return "";
}

答案 2

下面是来自 JSR 303 规范的代码示例

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

Driver driver = new Driver();
driver.setAge(16);
Car porsche = new Car();
driver.setCar(porsche);


Set<ConstraintViolation<Driver>> violations = validator.validate( driver );

所以,是的,您可以从验证程序工厂获取一个验证程序实例并自己运行验证,然后检查是否存在冲突。您可以在 javadoc for Validator 中看到它还将接受一个组数组进行验证。

显然,这直接使用JSR-303验证而不是通过Spring验证,但我相信如果弹簧验证注释在类路径中找到,它将使用JSR-303。


推荐