在不可变的Request类中使用Lombok

时间:2019-05-06 19:34:07

标签: java rest spring-boot post lombok

欢迎

我已经创建了简单的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类是不可变的。

以这种方式在Lombok中使用Immutable可以吗?

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"]
}

2 个答案:

答案 0 :(得分:0)

您可以使用启用的Answer属性将lombok.config文件添加到您的项目中:

addConstructorProperties

然后Lombok在生成构造函数时将生成lombok.anyConstructor.addConstructorProperties=true 注释。

因此您无需显式指定构造函数:

@java.beans.ConstructorProperties

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


更多信息:

答案 1 :(得分:0)

值本身是不可变的,不需要@Immutable。要使用Jackson进行序列化,请使用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;
}