【问题标题】:Using Lombok in immutable Request class在不可变请求类中使用 Lombok
【发布时间】:2019-09-24 10:47:38
【问题描述】:

欢迎,

我已经创建了简单的 Rest Controller:

 @RestController
 public class MyController {
    @PostMapping(value = "/cities", consumes = "application/json", produces = "application/json")
    public String getCities(@RequestBody Request request) {
        return request.getId();
    }
}

我希望 Request 类是不可变的。

这样可以将 Immutable 与 Lombok 一起使用吗?

import com.google.common.collect.ImmutableList;
import java.beans.ConstructorProperties;
import java.util.List;
import jdk.nashorn.internal.ir.annotations.Immutable;
import lombok.Getter;
import lombok.Value;

@Immutable
@Value
public final class Request {

    private final String id;
    private final ImmutableList<String> lista;

    @ConstructorProperties({"id", "lista"})
    public Request(String id, List<String> lista) {
        this.id = id;
        this.lista = ImmutableList.copyOf(lista);
    }

}

请求 JSON:

{
"id":"g",
"lista": ["xxx","yyy"]
}

【问题讨论】:

  • 根据projectlombok.org/features/Value我觉得还可以
  • 您为什么采用特定的@Immutable 注释,您认为它有什么作用? (@lombok.Value 通常就足够了。)
  • @chrylis 我认为@Immutable 仅用于文档目的。
  • @lealceldeiro 是的,但它被拉出一个明确不打算在外部使用的位置。

标签: java rest spring-boot post lombok


【解决方案1】:

您可以在启用addConstructorProperties 属性的情况下将lombok.config 文件添加到您的项目中:

lombok.anyConstructor.addConstructorProperties=true

那么Lombok会在生成构造函数的时候生成@java.beans.ConstructorProperties注解。

所以你不需要显式指定构造函数:

@Value
public class Request {
    private String id;
    private ImmutableList<String> list;
}

Jackson 将能够反序列化您的对象。


更多信息:

【讨论】:

    【解决方案2】:

    值本身是不可变的,不需要@Immutable。要使其可被杰克逊序列化,请使用 Lombok 的私人 @NoArgsConstructor

    import lombok.AccessLevel;
    import lombok.NoArgsConstructor;
    import lombok.Value;
    
    @Value
    @NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
    public class Request {
    
      Integer id;
      String name;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 1970-01-01
      • 2018-10-04
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多