【问题标题】:Java class validation with annotation带注解的 Java 类验证
【发布时间】:2021-09-21 14:02:32
【问题描述】:

我正在使用 Spring Boot。

我正在编写一个 Java 类,我想使用注释进行验证。 像这样的:

@Getter @Setter
@Validated
public class User {

    @NotBlank(message = "Username cannot be empty")
    private String username;

    @NotBlank(message = "Email address cannot be empty")
    @Email(message = "Please provide valid email address")
    private String email;

    @NotBlank(message = "First Name cannot be empty")
    private String firstName;

    @NotBlank(message = "Last Name cannot be empty")
    private String lastName;
}

如果我尝试使用错误的参数创建一个新对象,我想引发一个异常。 如果我尝试使用带有错误参数的设置器,结果相同。

有可能吗?我的代码错了吗?

【问题讨论】:

  • 如果您尝试使用 javax.validation,这是不可能的,如果 @Validated 和验证注释可能来自其他来源,请提供更多信息
  • 我正在使用 javax.validation,所以我知道这是不可能的。关于它的最佳做法是什么?它是关于字段验证的“手动”实现吗?
  • AFAIK,弹簧验证适用于 REST 请求和开箱即用的 JPA 实体验证。
  • 我没有将此类用于 Rest/JPA 实体
  • @Safari 通常,如果您想在调用 setter 和实例化对象时验证任何内容,您将使用不依赖 cdi 的系统在 setter 上手动编写验证。然后在构造函数中使用相同的验证,如果任何参数无效,则返回 IllegalArgumentException

标签: java spring-boot validation


【解决方案1】:

你可以自己调用验证器

@Component   
class SomeComponent{

 private Validator validator;

 SomeComponent(Validator validator){
   this.validator = validator;
 }

 void validateInput(Input input) {
   
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Set<ConstraintViolation<Input>> violations = validator.validate(input);
    if (!violations.isEmpty()) {
      throw new ConstraintViolationException(violations);
    }
  }
}

您可以在 Post Constructor 方法和 setter 中触发

【讨论】:

    【解决方案2】:

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
    • 不,该系统不能用于验证对象实例化,它适用于其他场景但不是指定的场景
    猜你喜欢
    • 2018-10-25
    • 2015-08-24
    • 1970-01-01
    • 2021-09-18
    • 2012-08-27
    • 2013-04-28
    • 2011-04-08
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多