将Lombok RequiredArgsConstructor用作JsonCreator

时间:2019-09-30 16:29:25

标签: jackson lombok

我想用这个:

    @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注释多参数构造函数中的每个参数。我了解这是Java事物(至少是Java 8事物),Jackson无法通过反射确定参数名称,因此注释必须存在,因此Jackson知道将json中每个字段传递到构造函数的位置。令人遗憾的是,这似乎很多余。

1 个答案:

答案 0 :(得分:0)

我遇到了与您相同的问题,在这里找到了解决方案 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
}

即使我没有找到对此@__(...)的引用,我也假定它会将注释转换为编译器的常量。