【问题标题】:How can I validate entities with spring data r2dbc?如何使用 spring data r2dbc 验证实体?
【发布时间】:2020-09-29 11:37:38
【问题描述】:

在 Spring data JPA 中,有一些注解可用于以声明的方式为实体设置验证。它们可以在javax.validation.constraints.*org.hibernate.validator.constraints.* 中找到(在插入 Hibernate 的情况下)。

例子:

    @NotNull
    private String lastName;

但是,如果是 Spring data r2dbc 的情况,它们不能开箱即用。

是否有任何简单流畅的方法来为 Spring data r2dbc 中的实体设置验证?在我看来,这应该不会太难,因为它可能不需要完整的 ORM 支持,只需在持久化之前检查对象字段的回调即可。

【问题讨论】:

    标签: java spring-data project-reactor spring-data-r2dbc


    【解决方案1】:
    1. 在 RestController 中,使用来自 Bean 验证和 Hibernate 验证器的注释来验证传入的请求正文。
    2. 对于您的服务中的 RouterFunction 或人工验证,在数据被(转换和)持久化到数据库之前,注入一个 Validator 或 ValidatorFactory 来验证请求正文。
    3. JPA 与 Bean Validation/Hibernate Validator 紧密集成,除了验证之外,默认会影响生成的方案。
    4. 在实际应用中,请勿将 Web 层中的数据分层实体类用作请求体类。

    【讨论】:

    • 我现在正在使用您在第 2 项中描述的内容。不幸的是,这是一种手动方法,不像 JPA 验证那样万无一失。我的意思是,使用 JPA,我们有一个验证层作为横切功能,因此不可能忘记在服务的方法中某处调用 validator.validate(),因为它总是 发生在幕后。
    【解决方案2】:

    它与 Bean Validation 和 Hibernate Validation 配合使用非常好。

    您可以使用在 JPA 中所做的所有相同注释,因为您是在 DTO 中进行的。

    看例子:

    @Data
    public class UserDto {
    
        private String name;
    
        @NotNull(message = "Last name can not be empty")
        private String lastName;
    
        @Min(value = 10, message = "Required min age is 10")
        @Max(value = 50, message = "Required max age is 50")
        private int age;
    }
    

    然后你的控制器将被注释:

    @RestController
    @RequestMapping("user")
    public class RegistrationController {
    
        @Autowired
        private UserService userService;
    
        @PostMapping("register")
        public Mono<UserDto> register(@Valid @RequestBody Mono<UserDto> userDtoMono{
            return this.userService.registerUser(userDtoMono);
        }
    }
    

    现在唯一的事情是您必须个性化您的消息,以便它返回您在 DTO 中设置的消息。要覆盖它,您应该创建一个 ExceptionHandler。

    @ControllerAdvice
    public class ValidationHandler {
    
        @ExceptionHandler(WebExchangeBindException.class)
        public ResponseEntity<List<String>> handleException(WebExchangeBindException e) {
            var errors = e.getBindingResult()
                    .getAllErrors()
                    .stream()
                    .map(DefaultMessageSourceResolvable::getDefaultMessage)
                    .collect(Collectors.toList());
            return ResponseEntity.badRequest().body(errors);
        }
    
    }
    

    我一直在我的项目中使用它,并从以下位置获得了这个示例:https://www.vinsguru.com/spring-webflux-validation/

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2018-08-22
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2020-07-04
      • 2012-08-06
      相关资源
      最近更新 更多