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

Lombok-为第三方Pojo创建生成器?

陆沈浪
2023-03-14

如何为第三方类创建Lombok生成器(即,我无法修改其源代码)?

我有一个无法更改的现有类:

public class ThirdPartyPojo {
    private String name;

    // default no-args constructor
    public ThirdPartyPojo() {}

    String getName() {
        return this.name;
    }

    void setName(String name) {
        this.name = name;
    }

    // many more properties, getters and setters
}

现在我想创建一个@Builder,这样我就可以得到一个流畅的Builder api,用默认值简化ThirdPartyPojo的实例化。这就是我所尝试的:

@Builder
public class ThirdPartyPojoBuilder extends ThirdPartyPojo {

    @Default
    private String name = "default name";

    // many more default values for other properties
}

代码已编译,我可以参考生成器,例如。

ThirdPartyPojo pojoWithDefaultName = ThirdPartyPojoBuilder.builder().build();
ThirdPartyPojo pojoWithCustomName = ThirdPartyPojoBuilder.builder().name("custom name").build();

System.out.println(pojoWithDefaultName.getName());
System.out.println(pojoWithCustomName.getName());

但是,对于pojoWithDefaultNamepojoWithCustomName而言,这不起作用,因为getName()返回null

共有1个答案

陆展
2023-03-14

您可以按如下方式执行此操作:

假设您的第三方POJO名为ThirdPartyPojo,与您的问题相同,具有以下源代码:

public final class ThirdPartyPojo {

    private String name, someText;
    private int id;
    
    public ThirdPartyPojo() {
        name = someText = null;
        id = 0;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public String getSomeText() {
        return someText;
    }

    public void setSomeText(final String someText) {
        this.someText = someText;
    }

    public int getID() {
        return id;
    }

    public void setID(final int id) {
        this.id = id;
    }
    
    @Override
    public String toString() {
        return Integer.toString(id) + ", " + name + ", " + someText;
    }
}

所以,在另一个类上创建一个构建器方法,就像这样:

import lombok.Builder;

public class ClientBuilder {

    @Builder(builderMethodName = "builder")
    public static ThirdPartyPojo newThirdPartyPojo(final int id,
                                                   final String name,
                                                   final String someText) {
        final ThirdPartyPojo tpp = new ThirdPartyPojo();
        tpp.setID(id);
        tpp.setName(name);
        tpp.setSomeText(someText);
        return tpp;
    }
}

方法应该接受所有可由生成器参数配置的。然后使用Builder方法中的setters根据给定的参数配置第三方Pojo

最后,您可以这样使用它:

public class Main {
    public static void main(final String[] args) {
        System.out.println(ClientBuilder.builder().name("The Name").someText("Some text...").id(5).build());
    }
}

不要像ThirdPartyPojoBuilder那样命名构建器类(即ThirdPartyPojo的名称附加了builder),因为它不起作用(至少对我来说不起作用)。

https://projectlombok.org/features/Builder
https://www.baeldung.com/lombok-builder#using-建筑工地施工法

 类似资料:
  • 问题内容: 我想为Kotlin创建POJO类,因为我们知道www.jsonschema2pojo.org将JSON转换为POJO,因此我们可以将其与gson一起使用。 有人知道如何 快速 为Kotlin创建Gson POJO 吗? 编辑: 我知道它使用Data类,但是有没有最简单的创建方法? 问题答案: 是的,我有解决方案 例如: 使用http://www.jsonschema2pojo.org/

  • 我正在尝试生成第三方超文本标记语言的PDF版本(实际上它是一个HTM文件)。这种超文本标记语言将来可能会改变,我绝对无法控制它。我想做的就是将其转换为PDF。 我已经尝试了2个解决方案:iText(使用XmlWorker)和Fliing-Saucer,但迄今为止没有成功。 我的问题是HTML文件非常不符合默认模式。示例: 第一个没有关闭标记(iText崩溃),第二个没有“http equiv”值的

  • 使用 Spring 使用 TCP 服务器 在 Spring 配置如下,来启动和关闭 H2 TCP 服务器 <bean id = "org.h2.tools.Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="star

  • 我在代码中使用Lombok自动生成getter和setter代码。我想添加其他个人注释并使用它。 例如,我想添加一个方法来验证列表中是否存在一个键: 创建注释后,我将执行以下操作:

  • 问题内容: 我创建了一个简单的POJO: 经过一番搜索,我发现了这一点: 但是有了这个我得到了错误: 我找到了另一个解决方案: 但是这种方法不存在。 那么如何将POJO转换为JSON? 问题答案: 只需使用java Gson API : 然后您可以从json 创建一个,如下所示: 看看 GSON用户指南 ,这 SIMPLE GSON实例 的详细信息。

  • 我在为Lombok getter和setter生成Javadoc时遇到问题。这两个建议我都试过了。示例字段及其文本如下所示: 但是,我在生成的Javadoc中既没有看到getter,也没有看到setter。我在Eclipse上使用受保护的可见性(项目-