[spring-projects/spring-boot]如果集合在另一个属性源中被覆盖,则绑定到集合会失败并出现未绑定元素错误

2024-04-10 850 views
0

你好,

从 Spring Boot 1.5.3.RELEASE 迁移到 2.1.3.RELEASE 后,我们遇到了属性绑定的错误(?)。

示例代码可以在这里找到。这是一个简单的应用程序,具有一个属性类,通过 @ConfigurationProperties 注释从 application.yml 接收值。

启动 DemoApplication 工作正常。

但是启动简单的 DemoApplicationTests 不起作用,因为演示使用“test”配置文件,因此属性类从“application-test.yml”接收其值。

如果“ignoreUnknownFields”不存在(即设置为 true),则不会发生异常。

Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'demo-properties' to com.example.demo.DemoApplication$DemoProperties
    at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:249) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:225) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:208) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:190) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bind(ConfigurationPropertiesBinder.java:83) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.bind(ConfigurationPropertiesBindingPostProcessor.java:107) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    ... 43 common frames omitted
Caused by: org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [demo-properties.data[2]] were left unbound.
    at org.springframework.boot.context.properties.bind.handler.NoUnboundElementsBindHandler.checkNoUnboundElements(NoUnboundElementsBindHandler.java:88) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.handler.NoUnboundElementsBindHandler.onFinish(NoUnboundElementsBindHandler.java:73) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.Binder.handleBindResult(Binder.java:235) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:222) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    ... 47 common frames omitted

仅当 application-test.yml 中的列表小于 application.yml 中的列表时,才会出现该错误。

问候,曼努埃尔

回答

4

感谢您提供的示例,非常有用。

我们加强了合并复杂类型的机制,请参阅文档

我不确定如果您将其与ignoreUnknownFields.如果我string6在测试配置文件中添加 a ,则异常会消失,因为完整列表已被替换。国际海事组织这不应该是必要的。

2

我认为这是一个错误,我们不应该抛出异常,因为列表已被完全覆盖。

0

team如果决定解决这个问题,我会很乐意解决这个问题?

9

感谢@rhamedy 的提议,但我已经在研究这个了。

8

我们在 Spring Boot 2.2.4 中遇到了完全相同的问题。根据此处的标签,看起来它已在 2.1.4 和 2.3.0 中修复。那是对的吗?是否也计划在某些 2.2.x 中进行修复?

2

@anatoliy-balakirev 所有修复都会向前合并。这在 2.1、2.2 和 master 中已修复。如果您认为自己发现了 Spring Boot 的问题,请构建一个小样本(zip 或 github 存储库的链接),并通过测试显示问题并创建新问题。

1

@snicoll 感谢您提供信息!在我看来,我提到的一个问题并不是什么新问题,而只是与当前问题有一点不同。唯一的区别是,在我的例子中,属性不是纯字符串,而是一些带有字段的对象。我已经分叉了一个原始示例存储库,并将其调整为使用带有嵌套属性的最新 spring boot / 配置: https://github.com/anatoliy-balakirev/spring-boot-configurationproperties-bug 只需运行mvn clean test,您就会得到:

[ERROR] contextLoads  Time elapsed: 0.001 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'demoApplication.DemoProperties': Could not bind properties to 'DemoApplication.DemoProperties' : prefix=demo-properties, ignoreInvalidFields=false, ignoreUnknownFields=false; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'demo-properties' to com.example.demo.DemoApplication$DemoProperties
Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'demo-properties' to com.example.demo.DemoApplication$DemoProperties
Caused by: org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [demo-properties.nested-data[0].data,demo-properties.nested-data[1].data,demo-properties.nested-data[2].data] were left unbound.
9

@anatoliy-balakirev 此问题已在已发布的版本中关闭,因此我们不会重新打开它。您能否将该评论移至新问题?

1

@anatoliy-balakirev 在您这样做之前,请查看我添加到您的示例中的评论。我认为这是错误的,例外是合法的,并且不会重现此问题。

9

@snicoll 抱歉,我可能遗漏了一些东西,但是你指的是哪些评论?

0

@anatoliy-balakirev 我认为 Stephane 正在谈论他添加到您的样本中的这些评论。

1

@mbhave 谢谢!这些天不经常使用 github。

@snicoll,你是对的,昨天下班后我试图快速创建一些东西,但生成了一些垃圾,抱歉(我们的真实项目也有同样的错误,所以我没有DemoApplication正确测试)。现在已经调整好了。尽管如此,问题仍然存在:DemoApplication可以启动,但DemoApplicationTests失败:

Caused by: org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [demo-properties.nested-data[2].data] were left unbound.
    at org.springframework.boot.context.properties.bind.handler.NoUnboundElementsBindHandler.checkNoUnboundElements(NoUnboundElementsBindHandler.java:83)
    at org.springframework.boot.context.properties.bind.handler.NoUnboundElementsBindHandler.onFinish(NoUnboundElementsBindHandler.java:71)
    at org.springframework.boot.context.properties.bind.Binder.handleBindResult(Binder.java:340)
    at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:321)
    ... 47 more