【发布时间】:2021-03-02 08:06:34
【问题描述】:
我有一个使用 Lombok 功能的 DTO,如下所示。但现在由于某些要求,我不得不将我的 DTO 扩展到一个父类,如下所示。我怎样才能在我的 DTO 中做最小的更改来支持它。我尝试使用 @SuperBuilder 注释,但失败了。
DTO 之前:
@Getter
@ToString
@EqualsAndHashCode
@Builder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class RequestMessage {
private final String name;
}
需要扩展的父类
@Data
@SuperBuilder(toBuilder = true)
@JsonDeserialize(builder = MyDTO.Builder.class)
public abstract class MyDTO implements Serializable {
@JsonIgnore private final ObjectMapper objectMapper = new ObjectMapper();
protected String myAccountId;
protected MyDTO() {}
public static int hashCode(Object... objects) {
return Arrays.deepHashCode(objects);
}
public static boolean equal(Object o1, Object o2) {
// implementation of equals method
}
public abstract String emitSerializedPayload() throws JsonProcessingException;
@JsonPOJOBuilder(withPrefix = "")
protected abstract static class Builder<T extends MyDTO, B extends Builder<T, B>> {
protected T dtoInstance;
protected B builderInstance;
public Builder() {
dtoInstance = createDtoInstance();
builderInstance = returnBuilderInstance();
}
protected abstract T createDtoInstance();
protected abstract B returnBuilderInstance();
public B myAccountId(String accountId) {
dtoInstance.myAccountId = accountId;
return builderInstance;
}
public T build() {
return dtoInstance;
}
}
}
我尝试手动构建 RequestMessageClass 并且它工作正常,但是我的应用程序中有很多类,我不想手动更改它们,如何使用注释或一些最小更改来更改我现有的 RequestMessage 类以使其正常工作。
这是我尝试过的,但在执行此操作时出现编译错误
RequestMessage.Builder().name(myName).myAccountId(myAcId).build();
我尝试的如下所示:
@Getter
@ToString
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class RequestMessage extends MyDTO {
private final String name;
@Override
public String emitSerializedPayload() throws JsonProcessingException {
// TODO Auto-generated method stub
return null;
}
}
【问题讨论】:
-
您也应该尝试将
@Builder或@SuperBuilder注释添加到您的父类中 -
我做到了@SuperBuilder(toBuilder = true) 但它不起作用,我更新了父类。
-
您不应该将 lombok
@Builder与静态内部类 Builder 混合使用。在您的情况下,最简单的方法是重构父类并将Builder类替换为@SuperBuilder(toBuilder = true)注释。 -
关于删除静态内部类并替换为您所说的超级构建器注释。它给出了错误,说 RequestMessage.Builder 无法解析为类型。在这行代码 RequestMessage.Builder().name(myName).myAccountId(myAcId).build(); 中以 RequestMessage 类型创建类 Builder;
-
你应该使用
.builder()而不是.Builder()
标签: java spring-boot java-8 lombok dto