当前位置: 首页 > 知识库问答 >
问题:

lombok为默认生成器调用子类函数

全心思
2023-03-14

我有两个类,其中父类在构建时需要来自子类的一些属性。有没有一种方法可以使用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()

共有3个答案

谷梁智
2023-03-14

虽然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)。

陆安国
2023-03-14

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();
邢鸿博
2023-03-14

按照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文档? 我找到了原因