在不可变请求类中使用 Lombok
Posted
技术标签:
【中文标题】在不可变请求类中使用 Lombok【英文标题】:Using Lombok in immutable Request class 【发布时间】: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 是的,但它被拉出一个明确不打算在外部使用的位置。
【参考方案1】:
您可以在启用addConstructorProperties
属性的情况下将lombok.config
文件添加到您的项目中:
lombok.anyConstructor.addConstructorProperties=true
那么Lombok会在生成构造函数的时候生成@java.beans.ConstructorProperties
注解。
所以你不需要显式指定构造函数:
@Value
public class Request
private String id;
private ImmutableList<String> list;
Jackson 将能够反序列化您的对象。
更多信息:
Lombok config Lombok @Value【讨论】:
【参考方案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;
【讨论】:
以上是关于在不可变请求类中使用 Lombok的主要内容,如果未能解决你的问题,请参考以下文章
从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的”