结合使用JSR-303和Spring的Validator为Spring Boot端点实现自定义验证逻辑

帕维尔

我试图实现使用的组合弹簧引导终点一些自定义的验证逻辑JSR-303 Bean Validation APISpring's Validator

根据Validator类图,似乎可以扩展其中之一CustomValidatorBeanSpringValidatorAdapterLocalValidatorFactoryBean将一些自定义验证逻辑添加到重写的方法中validate(Object target, Errors errors)

验证器类图

但是,如果我创建一个验证器来扩展这三个类中的任何一个并使用@InitBindervalidate(Object target, Errors errors)方法注册它,则永远不会调用它,并且不会执行任何验证。如果删除,@InitBinder则默认的弹簧验证器执行JSR-303 Bean Validation

休息控制器:

@RestController
public class PersonEndpoint {

    @InitBinder("person")
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new PersonValidator());
    }

    @RequestMapping(path = "/person", method = RequestMethod.PUT)
    public ResponseEntity<Person> add(@Valid @RequestBody Person person) {

        person = personService.save(person);
        return ResponseEntity.ok().body(person);
    }
}

自定义验证器:

public class PersonValidator extends CustomValidatorBean {

    @Override
    public boolean supports(Class<?> clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        super.validate(target, errors);
        System.out.println("PersonValidator.validate() target="+ target +" errors="+ errors);
    }

}

如果我的验证器实现了,org.springframework.validation.Validator则将validate(Object target, Errors errors)调用方法,但JSR-303 Bean Validation不会在此方法之前执行。我可以实现与SpringValidatorAdapter实现它类似的自定义JSR-303验证,JSR-303 Bean Validation但是必须有一种扩展它的方法:

    @Override
    public void validate(Object target, Errors errors) {
        if (this.targetValidator != null) {
            processConstraintViolations(this.targetValidator.validate(target), errors);
        }
    }

我已经研究过使用自定义JSR-303约束来避免同时使用org.springframework.validation.Validator所有约束,但是必须有一种使自定义验证器起作用的方法。

Spring验证文档在结合两者方面不是很清楚:

应用程序还可以为每个DataBinder实例注册其他Spring Validator实例,如第9.8.3节“配置DataBinder”中所述。这对于在不使用批注的情况下插入验证逻辑可能很有用。

然后,它涉及配置多个Validator实例

还可以通过dataBinder.addValidators和dataBinder.replaceValidators为DataBinder配置多个Validator实例。当将全局配置的Bean验证与在DataBinder实例上本地配置的Spring验证器结合使用时,这很有用。看 ???。

我正在使用Spring Boot 1.4.0。

帕维尔

每个@ M.Deinum-使用addValidators()而不是setValidator()可以解决问题。我也同意使用JSR-303,基于@AssertTrue方法的注释(专门用于跨字段验证)可能是一种更干净的解决方案。可以在https://github.com/pavelfomin/spring-boot-rest-example/tree/feature/custom-validator上找到代码示例在该示例中,中间名称验证是通过自定义spring验证器执行的,而姓氏验证是由默认jsr 303验证器处理的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用自定义HandlerMethodArgumentResolver的Spring MVC @Valid验证

来自分类Dev

JSR 303 Bean验证可以与Spring Data Rest一起使用吗?

来自分类Dev

注解中的Spring Boot JSR303消息代码被忽略

来自分类Dev

结合使用Picasso和自定义磁盘缓存

来自分类Dev

Spring MVC Controller JSR 303基本列表验证

来自分类Dev

Spring自定义验证批注+验证程序实现

来自分类Dev

Spring MVC:在同一个bean上使用不同的JSR-303验证器?

来自分类Dev

如何使用新的错误消息创建自定义MaxLength和Required验证,逻辑保持不变

来自分类Dev

如何在服务层中结合JSR-303和Spring Validator类?

来自分类Dev

如何自定义Spring Boot Actuator端点

来自分类Dev

Spring JSR-303 bean验证无效,绑定结果为空

来自分类Dev

使用Spring Boot进行PreAuthorize和自定义AuthenticationFilter

来自分类Dev

如何结合使用ServiceStack和自定义REST Api来实现自定义ResponseStatus

来自分类Dev

如何使用Spring Boot使用OAuth1.0和自定义标头对API进行身份验证

来自分类Dev

如何将Spring Validator和JSR 303混合使用

来自分类Dev

GWT JSR303验证,验证方法或使用自定义注释

来自分类Dev

自定义Bean验证程序-JSR303 / JSR349验证程序可以在无效时选择消息吗?

来自分类Dev

如果Spring Data Jpa和Hibernate中的@Id不是@GeneratedValue,则JSR303验证不会验证

来自分类Dev

Spring MVC Controller JSR 303基本列表验证

来自分类Dev

在Spring控制器和Spring Webflow中具有可选属性的一致JSR-303验证?

来自分类Dev

Spring + JSF2 + JSR 303 bean验证

来自分类Dev

JSR-303 / Spring MVC-使用组有条件地进行验证

来自分类Dev

Spring MVC:在同一个bean上使用不同的JSR-303验证器?

来自分类Dev

如何使用新的错误消息创建自定义MaxLength和Required验证,逻辑保持不变

来自分类Dev

如何自定义Spring Boot Actuator端点

来自分类Dev

结合使用Bootstrap CSS和自定义CSS

来自分类Dev

使用@Inject for Spring引导应用程序的自定义jsr验证程序测试失败

来自分类Dev

如何使用AWS api网关和Web api实施自定义身份验证(逻辑)

来自分类Dev

如何使用 ACF 为自定义帖子类型创建自定义端点?

Related 相关文章

  1. 1

    使用自定义HandlerMethodArgumentResolver的Spring MVC @Valid验证

  2. 2

    JSR 303 Bean验证可以与Spring Data Rest一起使用吗?

  3. 3

    注解中的Spring Boot JSR303消息代码被忽略

  4. 4

    结合使用Picasso和自定义磁盘缓存

  5. 5

    Spring MVC Controller JSR 303基本列表验证

  6. 6

    Spring自定义验证批注+验证程序实现

  7. 7

    Spring MVC:在同一个bean上使用不同的JSR-303验证器?

  8. 8

    如何使用新的错误消息创建自定义MaxLength和Required验证,逻辑保持不变

  9. 9

    如何在服务层中结合JSR-303和Spring Validator类?

  10. 10

    如何自定义Spring Boot Actuator端点

  11. 11

    Spring JSR-303 bean验证无效,绑定结果为空

  12. 12

    使用Spring Boot进行PreAuthorize和自定义AuthenticationFilter

  13. 13

    如何结合使用ServiceStack和自定义REST Api来实现自定义ResponseStatus

  14. 14

    如何使用Spring Boot使用OAuth1.0和自定义标头对API进行身份验证

  15. 15

    如何将Spring Validator和JSR 303混合使用

  16. 16

    GWT JSR303验证,验证方法或使用自定义注释

  17. 17

    自定义Bean验证程序-JSR303 / JSR349验证程序可以在无效时选择消息吗?

  18. 18

    如果Spring Data Jpa和Hibernate中的@Id不是@GeneratedValue,则JSR303验证不会验证

  19. 19

    Spring MVC Controller JSR 303基本列表验证

  20. 20

    在Spring控制器和Spring Webflow中具有可选属性的一致JSR-303验证?

  21. 21

    Spring + JSF2 + JSR 303 bean验证

  22. 22

    JSR-303 / Spring MVC-使用组有条件地进行验证

  23. 23

    Spring MVC:在同一个bean上使用不同的JSR-303验证器?

  24. 24

    如何使用新的错误消息创建自定义MaxLength和Required验证,逻辑保持不变

  25. 25

    如何自定义Spring Boot Actuator端点

  26. 26

    结合使用Bootstrap CSS和自定义CSS

  27. 27

    使用@Inject for Spring引导应用程序的自定义jsr验证程序测试失败

  28. 28

    如何使用AWS api网关和Web api实施自定义身份验证(逻辑)

  29. 29

    如何使用 ACF 为自定义帖子类型创建自定义端点?

热门标签

归档