[spring-projects/spring-boot]允许在记录组件上使用@DefaultValue

2024-05-14 748 views
9

@DefaultValue如果能够将注释与记录和 Lombok 自动生成的构造函数一起使用,将会非常有用。我在 spring-boot 中做了一些小的代码更改,它提供了这样的能力。

我创建了一个示例项目,显示了所需的用法,请参阅此公共存储库中的源代码并进行测试:https://github.com/An1s9n/spring-boot-sample

如有任何疑问,请随时与我联系,首选(也是最快)的方式是 Telegram:https://t.me/An1s9n

回答

6

@An1s9n 我们刚刚在团队会议上讨论过这个问题。

虽然我们认为这对于 Lombok 用户来说可能是一个有趣的补充,但我们认为为此注释添加字段+方法目标并不值得,因为它会让大多数 Java 用户处于可以在无效安排中使用它的位置。

记录组件目标对于所有 Spring Boot 用户都很有价值,我们希望实现它。您想用以下内容修改您的 PR 吗?

  • 仅针对记录组件变体
  • 为此案例添加单元测试。请注意,由于 Spring Boot 2.x 是使用 Java 8 构建的,因此我们的测试源代码中不能有记录,因此我们正在为 Java 16+ 执行条件测试并编写动态编译的源类(您可以看到681df90 中的安排)。

由于这需要更多的工作,并且这不会解决 Lombok 用例,因此如果您不想解决此问题,请随时告诉我们。

谢谢!

5

@bclozel,嗨!是的,我想按照你的描述修改我的 PR,因为我想为 Spring Boot 做出贡献,哈哈:))我会尽力尽快做到这一点。

2

@bclozel,我已经完成了你要求我做的事情:)如果还需要其他东西,请告诉我 - 我会修复它

3

我不确定注释处理器是否可以处理@DefaultValue这种开箱即用的使用。我们应该尝试一下,并在需要时创建一个单独的问题。

6

@snicoll,你的意思是元数据生成,对吗?

8

@snicoll,幸运的是它工作得非常完美,没有任何额外的改变! :) 我已经为这种情况添加了单元测试。

3

这是针对 2.7.x,我们使用 Java 8 进行编译,但ElementType.RECORD_COMPONENT在 Java 8 中不可用。我们需要决定是否愿意等到 3.0 来发布此增强功能,或者我们是否想要构建并发布一个多版本-为 Java 17 上的用户发布 jar。https://github.com/spring-projects/spring-boot/issues/25090与后一个选项相关。

4

我认为考虑到我们的构建生成多版本 jar 所需的工作量,我们应该将其移至 3.0。

0

非常感谢,@An1s9n。

4

自从合并这些更改以来,我们了解到它们实际上并不是必要的。现有PARAMETER目标 on@DefaultValue意味着@DefaultValue已经从记录组件传播到其相应的构造函数参数。绑定器和配置元数据注释处理器都从那里获取它。本期所做的更改仅意味着它将@DefaultValue传播到记录组件本身并使用反射从那里可用。这对于我们的目的来说不是必需的,但它可能不会造成任何损害。我将在即将召开的团队会议上将此标记为讨论,以便我们可以决定是否要保留目标RECORD_COMPONENT或恢复目标。