【问题标题】:Spring Boot Immutable validation only work with get prefixSpring Boot 不可变验证仅适用于 get 前缀
【发布时间】:2021-11-20 18:01:49
【问题描述】:

我正在尝试在不可变对象上实现 Javax 验证,但我只能通过使用前缀“get”重命名每个变量来使其工作。没有那个“get”就可以让它工作吗?

    @Value.Immutable
    public interface Entity {
        @Min(19)
        int getAge();

        @NotBlank
        @Size(min = 10)
        String getName();

    }

我的控制器:

@PostMapping("/entity/")
public ResponseEntity post2(@RequestBody @Valid ImmutableEntity entity) {


    return  new ResponseEntity<Object>("", HttpStatus.OK);
}

【问题讨论】:

    标签: java spring spring-boot bean-validation immutables-library


    【解决方案1】:

    如果我对@Value.Immutable 的理解正确,您应该在类或接口上使用表示要生成的字段的方法对其进行注释。示例:

    @Value.Immutable
    public interface Entity {
        int getAge();
        String getName();
    }
    

    这意味着将生成以下内容:

    @Generated(from = "Entity", generator = "Immutables")
    public final class ImmutableEntity implements Entity {
      private final int age;
      private final String name;
    
      private ImmutableEntity(int age, String name) {
        this.age = age;
        this.name = name;
      }
    
      @Override
      public int getAge() {
        return age;
      }
    
      @Override
      public String getName() {
        return name;
      }
    
      (...)
    }
    

    如果您不遵循getXXXXX() 模式,您将得到一个不同的生成类,如下所示:

    @Value.Immutable
    public interface Entity {
        int age();
        String name();
    }
    

    有了这个,你会得到以下生成的类:

    @Generated(from = "Entity", generator = "Immutables")
    public final class ImmutableEntity implements Entity {
      private final int age;
      private final String name;
    
      private ImmutableEntity(int age, String name) {
        this.age = age;
        this.name = name;
      }
    
      @Override
      public int age() {
        return age;
      }
    
      @Override
      public String name() {
        return name;
      }
    
      (...)
    }
    

    注意差异。在第一个中,您有普通的 getter,在第二个中,您有“getter”,方法名称中没有前缀 get。 Javax Validation 使用普通的 getter 来获取数据,以便对其进行验证。在第二个生成的类中,getter 不遵循通常的命名约定,因此 Javax 验证不起作用。

    【讨论】:

    • 谢谢,但我看到了一些使用不带 get 前缀的验证的示例。
    • 当然,但问题不在于验证,而在于@Value.Immutable 本身。如果不使用getXXXX,在生成的实现类中是否得到对应的属性?我猜不是。
    • immutables.github.io在官方文档中有一些没有get的例子
    • 请检查我的答案,我已经编辑过了。
    • 这似乎不可能。根据reference documentation:“要求该类遵循JavaBeans的方法签名约定,为类型T的每个约束属性读取属性(...),有一个getter方法,get。对于布尔属性,is 是 getter 方法的替代名称。”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2020-09-08
    • 2018-07-04
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多