手动调用Spring Annotation Validation

新手上路,请多包涵

我正在使用 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 类,但这是我想避免的事情,我更愿意只在类变量本身上使用注释。

原文由 Ross Hettel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 835
2 个回答

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 "";
}

原文由 Pavel Horal 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是来自 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 );

所以是的,您可以从验证器工厂获取一个验证器实例并自己运行验证,然后检查是否存在违规行为。您可以在 Validator 的 javadoc 中 看到,它还将接受一组要验证的组。

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

原文由 digitaljoel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题