【问题标题】:How to enable bean validator - Spring boot如何启用 bean 验证器 - Spring Boot
【发布时间】:2019-06-09 09:16:20
【问题描述】:

我正在将来自 Kafka 的数据消耗到一个 bean 类中,该类具有验证以确保我正在阅读的消息具有有效数据。

我在 bean 类中添加了注释,例如 @NotNull 和 @Pattern,但没有得到应用。

public class Class {
    @NotNull
    private String field1;

    @Pattern(regexp = "^Open$|^Active$|^Overdue$|^Inactive$")
    private String field2;
}

如何确保应用 bean 验证,我之前在创建 REST 服务时使用了 @RequestBody @Valid 但不确定如何在这种情况下应用。

【问题讨论】:

  • 您是否使用BindingResult result 跟进请求正文属性。 bean 定义的错误将在BindingResult 中。检查result.hasErrors()是否有任何bean错误
  • 我建议使用 avro 模式并让反序列化程序处理无效消息。由于没有客户可以报告,因此跟踪验证错误是没有意义的。
  • @ManishBansal 我之前使用的是 Avro 模式,但必须在我实现 kafka 客户端 Deserializer 类的地方切换自定义反序列化器。
  • Kafka 用于 B2B 通信目的。消息是由您自己的其他服务或第三方服务生成的。因为,它不是用户输入的数据,在这两种情况下,它都是有效的数据。为什么要验证这一点?您可以与消息生产者签订合同,如果无法反序列化消息,则忽略该消息。请在这里告诉我您的用例。

标签: java spring-boot hibernate-validator spring-validator


【解决方案1】:

Programmatic Validation :

一些框架(例如 Spring)具有简单的方法来触发验证过程,只需使用注释即可。这主要是为了让我们不必与编程验证 API 进行交互。

现在让我们走手动路线并以编程方式进行设置:

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

要验证一个 bean,我们首先必须有一个 Validator 对象,它是使用 ValidatorFactory 构造的。

我们现在要设置这个无效用户 - 使用一个空名称值:

User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);

现在我们有了一个验证器,我们可以通过将它传递给 validate 方法来验证我们的 bean。任何违反 User 对象中定义的约束的行为都将作为 Set 返回。

Set<ConstraintViolation<User>> violations = validator.validate(user);

通过迭代违规,我们可以使用getMessage方法获取所有违规消息。

for (ConstraintViolation<User> violation : violations) {
log.error(violation.getMessage()); 
 }

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2020-09-25
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多