我有两个类,其中父类在构建时需要来自子类的一些属性。有没有一种方法可以使用lombok构建器来支持这一点?
Parent.java
import lombok.Builder;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder
public abstract class Parent {
@Builder.Default
private String requestType = getRequestTypeFromSubclass();
abstract String getRequestTypeFromSubclass();
}
小孩JAVA
import lombok.Builder;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Getter
@SuperBuilder
public class Child extends Parent {
@Override
String getRequestTypeFromSubclass() {
return "Child1";
}
}
上面的编译失败,并显示消息
错误:无法从静态上下文@SuperBuilder引用非静态方法getRequest estType()
虽然lombok在很多方面都是一个很好的工具,但在这个例子中,您可能希望避免使用生成器模式。您想要的效果(在父级初始化时访问子级方法)可以在标准POJO构造函数中实现。以下内容对我很有用:
@Getter
public abstract class Parent {
private String requestType = defineRequestType();
protected abstract String defineRequestType();
}
@Getter
public class Child extends Parent {
protected String defineRequestType() {
return "child1";
}
}
以及以下测试用例:
@Test
public void test_lombokBuilderPolymorphism() {
Child child1 = new Child();
assertEquals("child1", child1.getRequestType());
}
因此,除非您出于某些其他原因明确需要构建器模式,否则缺省POJO的功能在这里似乎就足够了。
另请注意:您应该命名定义方法,而不是get
getRequestType
)。
Builder。默认值
在静态范围中定义,表达式可能无法解析抽象方法实现。
您可能想试试这个:
@Getter
@SuperBuilder
public abstract class Parent {
private String reqType;
abstract String getRequestType();
public String getReqType() {
return Objects.isNull(reqType) ? getRequestType() : reqType;
}
}
使用与实际属性getter方法不同的方法名重写属性方法,并应解决此问题。
尝试:
Parent parent = Child.builder().build();
按照Baeldung中的建议,使用toBuilder=true
并删除@Builder。默认值
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder(toBuilder=true)
public abstract class Parent {
private String requestType = getRequestType();
abstract String getRequestType();
}
这样,我们就可以摆脱双重初始化
更改调用Builder使用toBuilder
,子:
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder
public class Child extends Parent {
@Override
String getRequestType() {
return "Child1";
}
public static void main(String[] args) {
Child child = Child.builder().build();
System.out.println(child.getRequestType());
}
}
龙目岛的版本是1.18.0。 我在类级别设置了。 当我尝试为列表变量设置默认值时: 我得到一个错误: 除了自己编写生成器之外,还有其他方法吗?
我正在用Lombok插件做一个Spring项目。我添加了注释,并使父类的字段最终初始化,使用@AllArgsConstructor或@必需ArgsConstructor而不是字段注入(使用类字段的@autowed)。但是,由于某种原因,子类DraftsPostmethod报告了一条消息,即在父类AbstractFuntoryServicemethod中没有找到默认构造函数 我不确定是什么导致了它,
问题内容: 我正在将Lombok项目与Spring Data JPA一起使用。有什么方法可以将Lombok 与JPA默认构造函数连接? 码: 据我所知,JPA需要默认的构造函数,该构造函数被注解覆盖。有什么解决方法吗? 这段代码给我错误: 问题答案: 更新 根据反馈和John的回答,我已更新了不再使用or的答案,而是通过和创建访问器和变量,通过创建默认构造函数via,最后我们创建了构建器通过via
我使用默认构造函数从子类中设置recordId的值,最初没有使用lombok。最终我决定在这里使用构建器,但现在的问题是lombok构建器在内部覆盖了我的默认构建器,因此从未设置值。
试图用Joda DateTimes生成JooQ POJOs,我遇到了一些问题。POJO使用默认的java.sql从生成器中生成。时间戳值,而不是日期时间。 代码如下。 Create Table(此处时间戳字段的名称已更改)希望确保我没有命中构建系统中的某个缓存。此名称仍应与下面的正则表达式匹配。 转换类——基于文档。 Jooq配置XML。基于文档(感谢您捕获我的表达式/表达式错误Luke)! 创建
我正在使用库在我的Spring启动应用程序中显示摇摆不定的UI API文档 http://localhost:8080/swagger-ui.html。 简而言之,这个问题是:如何使用springdoc openapi webflux ui显示应用程序API文档? 我找到了原因