【问题标题】:Using Lombok RequiredArgsConstructor as JsonCreator使用 Lombok RequiredArgsConstructor 作为 JsonCreator
【发布时间】:2020-01-29 23:33:07
【问题描述】:

我很想用这个:

    @Getter
    @ToString
    @RequiredArgsConstructor(onConstructor_ = {@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)})
    private static class RestErrorObject {
        private final String error;             // optional
        private final String message;           // optional
        private final String path;              // optional
        private final String status;            // optional
        private final String timestamp;         // optional
    }

但是,我必须使用这个:

    @Getter
    @ToString
    private static class RestErrorObject {
        private final String error;             // optional
        private final String message;           // optional
        private final String path;              // optional
        private final String status;            // optional
        private final String timestamp;         // optional

        @JsonCreator
        RestErrorObject(@JsonProperty("error") String error, @JsonProperty("message") String message,
                @JsonProperty("path") String path, @JsonProperty("status") String status,
                @JsonProperty("timestamp") String timestamp) {
            this.error = error;
            this.message = message;
            this.path = path;
            this.status = status;
            this.timestamp = timestamp;
        }
    }

有什么方法可以将 Lombok 的 RequiredArgsConstructor 注释与 Jackson 的 JsonCreator 一起使用?问题似乎是杰克逊古老的要求,即多参数构造函数中的每个参数都用@JsonProperty 注释。我知道这是Jackson无法通过反射确定参数名称的Java事物(或至少是Java 8事物),因此注释必须存在,因此Jackson知道将每个字段从json传递到构造函数的位置。可悲的是,这似乎是多余的。

【问题讨论】:

  • lombok.anyConstructor.addConstructorProperties = true 放入您的lombok.config 文件有帮助吗?

标签: java jackson lombok


【解决方案1】:

我遇到了和你一样的问题,在这里找到了解决方案 https://projectlombok.org/features/constructor

要在生成的构造函数上添加注释,可以使用 onConstructor=@__({@AnnotationsHere}),但要小心;这是一 实验特征。有关更多详细信息,请参阅文档 onX 功能。

@Getter
@ToString
@RequiredArgsConstructor(onConstructor=@__(@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)))
private static class RestErrorObject {
    private final String error;             // optional
    private final String message;           // optional
    private final String path;              // optional
    private final String status;            // optional
    private final String timestamp;         // optional
}

即使我没有发现对这个 @__(...) 的引用,我认为它会将注解转换为编译器的常量。

【讨论】:

  • 另外,你可以用这个@AllArgsConstructor(onConstructor_= {@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)} )
  • 根据文档,对于属性 onConstructor:此处列出的任何注释都放在生成的构造函数上。此功能的语法取决于 JDK 版本(我们对此无能为力;它是为了解决 javac 错误)。直到 JDK7:@RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere})) from JDK8: @RequiredArgsConstructor(onConstructor_={@AnnotationsGohere}) // 注意 onConstructor 后面的下划线。返回:应用于生成的构造函数的注释列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2018-12-10
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2018-04-11
  • 2020-12-02
相关资源
最近更新 更多