繁体   English   中英

如何使用 spring 数据 r2dbc 验证实体?

[英]How can I validate entities with spring data r2dbc?

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

例子:

    @NotNull
    private String lastName;

但是,如果是 Spring 数据 r2dbc,则开箱即用。

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

  1. 在 RestController 中,使用来自 Bean 验证和 Hibernate 验证器的注释来验证传入的请求正文。
  2. 对于服务中的 RouterFunction 或手动验证,在数据(转换和)持久化到数据库之前,注入 Validator 或 ValidatorFactory 以验证请求正文。
  3. JPA 与 Bean Validation/Hibernate Validator 紧密集成,除了验证之外,它默认会影响生成的方案。
  4. 在现实世界的应用程序中,不要使用 web 层中的数据分层实体类作为请求主体类。

它与 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;
}

然后你的 controller 将被注释:

@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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM