【问题标题】:Lombok Builder with defaults in Spring Data在 Spring Data 中具有默认值的 Lombok Builder
【发布时间】:2017-06-08 13:41:24
【问题描述】:

我有以下(简化的)类:

@Entity
@Data
@Builder
@NoArgsConstructor // @Builder creates the all-args version but I need this one elsewhere.
@AllArgsConstructor(access = AccessLevel.PRIVATE) // Having @NoArgsConstructor disables the @AllArgsConstructor needed by @Builder unless I have this explicitly applied
public class MyClass {

  // ...
  @Builder.Default
  private String foo = "Some Default Value"
  // ...

}

这在一般情况下工作正常,但是当这个实体由 Spring 构建时会出现问题(特别是 Spring Data Repository 以响应创建它的 REST 请求)。 Spring 看到全参数构造函数并使用它,为 foo 设置一个空值(在这种情况下,它没有在 POST 数据中设置),我最终得到一个 foo 的空值,而不是预期的"Some Default Value"@Builder.Default

简单地创建setter并防止空值是行不通的。我可以明确地写出 AllArgsConstructor ,但这(在某种程度上)在某种程度上违背了 Lombok 的目的。不是一个糟糕的解决方案,但并不理想。

谁能想到任何解决方法?

【问题讨论】:

  • 您是否尝试更改 AccessType。在课堂上试试这个@AccessType(AccessTpe.FIELD)
  • 我看不出它是如何工作的。 AccessType 是关于数据层如何获取要持久化的值的,对吧?直接通过字段或通过访问器。此外,默认值已经是字段访问,所以这甚至不会是一个改变,我不认为。

标签: spring spring-data lombok


【解决方案1】:

我知道您可以使用非龙目岛默认值指定默认值。我还没有尝试过这种特殊情况,但值得一试。

@Value("#{prop['my.property'] ?: 12345}")

也许您应该尝试使用 RequiredArgs 构造函数,它只指定一个使用“每个最终/非空字段一个参数”并且不会覆盖 var 的构造函数。

https://projectlombok.org/features/constructor

【讨论】:

  • 无论如何,Builder 注释都需要 AllArgsConstructor。 Spring 似乎渴望选择全参数版本而不是任何其他版本。那是哪个值注释? Lombok 不能应用于属性,我认为 Spring 在这里不会有任何好处。它将默认值设置为设计时未知的值,但不会覆盖全参数构造函数的行为。
【解决方案2】:

我能够在我的模型类中使用 PrePersist 注释来解决这个问题。使用 PrePersist,我可以确保 null 值设置为默认值,无论它们何时设置为 null 或由谁设置。不是真正解决这个问题,但我可能应该做一些事情,所以这是一个可以接受的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2018-10-02
    • 2018-04-13
    相关资源
    最近更新 更多