【问题标题】:Getting around Json jackson and lombok constructor requirements绕过 Json jackson 和 lombok 构造函数要求
【发布时间】:2019-08-14 17:59:02
【问题描述】:

使用 json 保存和加载数据需要 json 的构造函数来加载对象,而我无法让 lombok 注释来处理它。我该怎么办?

这是我的班级在尝试使用注释来构造我的项目之前和之后的样子:

@Data
public class Item { //before

    private int id;

    private int amount;

    public Item(@JsonProperty("id") int id, @JsonProperty("amount") int amount) {
        this.id = id;
        this.amount = amount;
    }

}
@Data
@AllArgsConstructor 
@NoArgsConstructor //I don't want this here as it could cause complications in other places.  But json requires I have this...
public class Item { //after

    private int id;

    private int amount;

}

我不想使用 lombok 的 NoArgsConstructor 注释,因为我不想要此类的无参数构造函数。我意识到我可以这样做:

private Item() {
}

但希望有更好的方法...

【问题讨论】:

标签: java json jackson annotations lombok


【解决方案1】:

从 lombok 1.18.4 开始,您可以配置将哪些注解复制到构造函数参数中。将此插入您的lombok.config

lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty

然后将@JsonProperty 添加到您的字段中:

@Data
@AllArgsConstructor 
public class Item {
    @JsonProperty("id")
    private int id;

    @JsonProperty("amount")
    private int amount;
}

虽然注解参数看似不必要,但实际上是必需的,因为在运行时构造函数参数的名称不可用。

【讨论】:

  • 太棒了,你也可以使用final字段
【解决方案2】:

尝试将其添加到您的 lombok 配置文件中:

lombok.anyConstructor.addConstructorProperties=true
config.stopBubbling = true

【讨论】:

  • 没有比这更好的方法了吗?有没有办法像第一个代码示例中那样通过将构造函数参数添加到示例 2 中的 AllArgsConstructor 来使用 @JsonProprty 注释构造函数参数?即@AllArgsConstructor(argumentsAnnotation = @JsonProperty)
【解决方案3】:

所以你说的是 Jackson 需要无参数构造函数进行反序列化,并且你不想在你的类中添加无参数构造函数,因为这与你的模型不兼容。

Lombok 在这里完全无关紧要 - 无论是手动编写无参数构造函数还是由 Lombok 生成,它都为零,它仍然只是一个无参数构造函数。

您真正的问题是 - 我可以让 Jackson 在目标类上没有无参数构造函数的情况下工作。已经有多个答案,您几乎已经完成了。以下是必须要做的事情:

  1. 在你的构造函数中添加@JsonCreator注解
  2. 在构造函数参数中添加@JsonProperty("propName")

你做到了#2,但没有做到#1。添加它,这应该可以解决您的问题。

【讨论】:

  • 以及如何让@Data (Lombok) 之类的东西在其 required-args 构造函数中生成@JsonCreator
  • 很遗憾,Lombok 无法做到这一点 - 如果您想要自定义注释,则必须手动添加带有这些注释的构造函数。
  • 我实际上发现,有某种方法 - 见projectlombok.org/features/experimental/onX。可以编写类似@AllArgsConstructor(onConstructor=@__(@Inject)) 的东西,据说它会使用@Inject 注释来注释全参数构造函数(这只是一个示例)。这很难看,但我相信这就是我最终使用的:@Data @RequiredArgsConstructor (onConstructor_ = {@ConstructorProperties ( {"property1", "property2"})}),在实际课堂上进行了注释。不过,此时手动编写构造函数可能是一个更好的主意。
猜你喜欢
  • 2019-02-11
  • 2021-06-29
  • 2019-01-03
  • 2016-03-18
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多