java - 可选的 Lombok 自定义构建方法表示无法引用非静态变量

标签 java lombok intellij-lombok-plugin

给出以下代码。

@Getter
@Builder(builderClassName = "Builder", buildMethodName = "build")
public final class BusinessEvent implements BusinessPayload {
  private String action, duration, outcome, provider, trackId, sequence;
  @lombok.Builder.Default private Optional<String> brand, vin, externalTrackId, code = Optional.empty();
  @lombok.Builder.Default private Optional<BusinessEventError> eventError = Optional.empty();

  static class Builder {
    BusinessEvent build() throws MissingRequiredValueException {
      // Custom validation
      return new BusinessEvent(action, duration, outcome, provider, trackId, sequence, brand, vin, externalTrackId, code, eventError);
    }
  }
}

我收到错误

java: non-static variable eventError cannot be referenced from a static context

在这种情况下,lombok 无法正确处理可选值?我在所有 build 者身上都看到了同样的问题。这不会被 intellij 插件显示为问题,但仅在我尝试构建时显示为问题。

我知道您不应该使用可选值作为字段值,但在这种情况下,它使 API 更加清晰,并且构建器无论如何都不会被序列化,我们为此提供了 DTO。

最佳答案

总结一下你想做的事情:

  • 您想要一个由 lombok 生成的构建器
  • 您希望使用 @Default 在构建器中分配默认值
  • 您希望在构建方法中进行自定义验证

这似乎不起作用。既不适用于Optional,也不适用于其他对象。似乎是 lombok 的限制。

IntelliJ 没有将其识别为错误这一事实并不意味着它应该可以工作。但是你的编译失败了。这是一个现实问题。

考虑以下代码,不带 @lombok.Builder.Default 注释:

@Getter
@Builder(builderClassName = "Builder", buildMethodName = "build")
public final class BusinessEvent {
    private String action, duration, outcome, provider, trackId, sequence;
    private Optional<String> brand, vin, externalTrackId, code = Optional.empty();
    private Optional<Object> eventError = Optional.empty();

    static class Builder {
        BusinessEvent build() {
            if (brand == null) {
                throw new RuntimeException("brand not set");
            }
            // Custom validation
            return new BusinessEvent(action, duration, outcome, provider, trackId, sequence, brand, vin, externalTrackId, code, eventError);
        }
    }

    public static void main(String[] args) {
        BusinessEvent eventWithBrand = BusinessEvent.builder().brand(Optional.of("brand")).build();
        // will throw exception
        BusinessEvent event = BusinessEvent.builder().build();
    }
}

关于java - 可选的 Lombok 自定义构建方法表示无法引用非静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59191793/

相关文章:

Java 记录和 Lombok 注释 - IntelliJ

intellij-idea - Lombok 与 IntelliJ 2020.2 不兼容

java - 在 Intellij 中查找 lombok 生成的 getter/setter 的用法

java - 让子类序列化为父类(super class)的实例?

java - 构造函数注入(inject)的空指针异常并与字段注入(inject)mockito一起使用

java - 更新方法中列表的参数 : return list or not

java - Lombok、Spring mongodb 和 jackson 构造函数问题

java - 获取 Log4j2 错误

java - Spring 与 Callable 异步如何工作以及我不明白的地方?

java - JSON/Jackson 输出在每个节点上意外添加 "parent"元素