0

我正在尝试在不可变对象上实现 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);
}
4

1 回答 1

2

如果我理解@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,在第二个中,您有“getters” get,方法名称中没有前缀。Javax Validation 使用普通的 getter 来获取数据,以便对其进行验证。在第二个生成的类中,getter 不遵循通常的命名约定,因此 Javax 验证不起作用。

于 2021-09-28T17:38:41.843 回答