有人可以请给我一个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)
谢谢
更新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)
请注意,在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)
| 归档时间: |
|
| 查看次数: |
6527 次 |
| 最近记录: |