【问题标题】:Constraints validation in a postconstruct method构造后方法中的约束验证
【发布时间】:2022-01-08 02:33:49
【问题描述】:

你好,我有下一段代码:

@Setter
@Getter
@Builder
public class User {
  
  @Pattern(regexp = "[a-zA-Z]*")
  private String username;

  public User(String username){
    this.username = username;
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Set<ConstraintValidation<User>> violations = factory.getValidator().validate(this);
    if(!violations.isEmpty) throw new ConstraintViolationExcetion(violations);
}

它正在工作,当我尝试创建用户时,它总是检查约束(也使用构建器模式),但我想避免生成构造函数并使用 lombok 注释 @AllArgsConstructor 并使用来自 javax 的 PostConstruct进行验证。

@Setter
@Getter
@AllArgsConstructor
@Builder
public class User {
  
  @Pattern(regexp = "[a-zA-Z]*")
  private String username;

  @PostConstruct
  public void valid() {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Set<ConstraintValidation<User>> violations = factory.getValidator().validate(this);
    if(!violations.isEmpty) throw new ConstraintViolationExcetion(violations);
}

我正在使用 JAVA11,包括 javax.annotation 依赖项。用户是一个普通的对象,而不是一个spring的bean。 但是这种方式行不通......我怎样才能让它工作?谢谢。

【问题讨论】:

  • User 是 EJB / Spring bean 还是常规对象?
  • 它是一个普通对象

标签: java validation constraints lombok builder


【解决方案1】:

如果您使用9 或更高版本的java 版本,@PostConstruct 已被弃用,因此您可能需要手动添加依赖项。你能补充一下你使用的是哪个java版本吗?

它不起作用的另一个原因是因为您没有应用 @Component 注释,而 @PostConstruct 仅适用于由 spring 容器管理的 bean。

参考:Why is PostConstruct not called?

我建议您查看BeanPostProccessorAOP,因为它更灵活并且允许您对您的bean 进行验证。这也是pure aop。

【讨论】:

  • 已添加!谢谢。但我不想包含@Component 注释,因为我认为它与控制器或服务不同。我错了吗?
  • @Service@Rpository@Controller@Component,但只需将它们视为不同的角色。或者作为@Component 的孩子,但是,如果没有这些注释之一@PostConstruct 将无法工作,因为没有框架响应和管理它们。所以你必须在带有@Component 注释的POJO 下使用它。否则它会被忽略。
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多