带有json注释的Lombok @SuperBuilder示例

Seb*_*ees 9 java lombok

有人可以请给我一个lombok @SuperBuilder实验注释的工作实例吗?

我无法让它运行,并且没有可用文档的代码示例.

目前我的代码如下所示:

超类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = SubA.class),
  @JsonSubTypes.Type(value = AnotherSub.class)
})
@Getter
@Accessors(fluent = true, chain = true)
@SuperBuilder
public abstract class AbstractA {

    @JsonProperty
    protected final String superProperty;
}
Run Code Online (Sandbox Code Playgroud)

而子类:

@Getter
@EqualsAndHashCode(callSuper = true)
@Accessors(fluent = true, chain = true)
@SuperBuilder
@JsonDeserialize(builder = SubA.SubABuilder.class) // class not found?
@JsonTypeName("SubA")
public class SubA extends AbstractA {

    @JsonProperty
    private final String fieldA;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Jan*_*eke 7

更新2018-11-10:Lombok 1.18.4发布

对于Lombok @Builder@SuperBuilder与Jackson合作,您必须手动添加构建器类标题并在其@JsonPOJOBuilder(withPrefix="")上放置.然后,Lombok将仅生成构建器类的其余部分.这是必要的,因为Jackson的默认值是构建器的setter方法具有"with"作为前缀,但是Lombok的构建器没有任何前缀(并且Lombok不是,并且在这方面可能永远不可配置).

@SuperBuilder在龙目岛1.18.2介绍,这是不能自定义(即,你不能手动添加的生成器类头).因此,@SuperBuilder与杰克逊一起使用并不容易.

这改变了Lombok 1.18.4(请参阅此拉取请求):@SuperBuilder现在(至少部分)可自定义,这允许我们添加注释.请注意,生成的代码@SuperBuilder非常复杂,并且需要使用泛型.为避免意外搞乱代码,您应该查看delombok输出并从那里复制/粘贴类标题.在这里,您需要添加构建器实现类标头并在其上添加注释:

@JsonPOJOBuilder(withPrefix="")
static final class SubABuilderImpl extends SubABuilder<SubA, SubABuilderImpl> {
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须扩大SubABuilderImpl至少package-private 的可见性.

@JsonDeserialize注释还必须参照执行建设者类,而不是抽象的建设者:

@JsonDeserialize(builder = SubA.SubABuilderImpl.class)
Run Code Online (Sandbox Code Playgroud)


And*_*eas 5

请注意,在Eclipse中有效的解决方案是Lombok IntelliJ集成不支持所有功能,因此代码可以在Eclipse和javac中很好地编译,但是IntelliJ认为它已损坏,但是执行代码没有问题。

public static ObjectMapper createObjectMapper() {

    final ObjectMapper mapper = new ObjectMapper();
    mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {

        @Override
        public JsonPOJOBuilder.Value findPOJOBuilderConfig(final AnnotatedClass ac) {
            if (ac.hasAnnotation(JsonPOJOBuilder.class)) {
                return super.findPOJOBuilderConfig(ac);
            }
            return new JsonPOJOBuilder.Value("build", "");
        }
    });

    return mapper;
}

public static void main(final String[] args) throws Exception {
    final ObjectMapper objectMapper = createObjectMapper();

    final String serializedForm = objectMapper.writeValueAsString(SubA.builder().build());
    System.out.println(serializedForm);
    final SubA anA = objectMapper.readValue(serializedForm, SubA.class);
    System.out.println(anA);
}


@Getter
@EqualsAndHashCode(callSuper = true)
@Accessors(fluent = true, chain = true)
@SuperBuilder
@JsonDeserialize(builder = SubA.SubABuilderImpl.class)
@JsonTypeName("SubA")
public static class SubA extends AbstractA {

    @JsonProperty
    private final String fieldA;
}


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = SubA.class)
})
@Getter
@Accessors(fluent = true, chain = true)
@SuperBuilder
public static abstract class AbstractA {

    @JsonProperty
    protected final String superProperty;
}
Run Code Online (Sandbox Code Playgroud)