我使用的是Sping Boot 1.4.3 @AutoConfiguration
,我根据用户指定的属性自动创建bean。用户可以指定服务数组,其中名称和版本为必填字段:
service[0].name=myServiceA
service[0].version=1.0
service[1].name=myServiceB
service[1].version=1.2
...
如果用户忘记在一个服务上指定一个必需的字段,那么我希望后退,不创建任何bean。我可以用@ConditionalOnProperty
来实现吗?我想要的是:
@Configuration
@ConditionalOnProperty({"service[i].name", "service[i].version"})
class AutoConfigureServices {
....
}
5条答案
按热度按时间scyqe7ek1#
这是我创建的自定义
Condition
。它需要一些抛光更通用(即不硬编码字符串),但对我来说工作得很好。为了使用,我用
@Conditional(RequiredRepeatablePropertiesCondition.class)
注解了Configuration类7jmck4yq2#
您可以利用
org.springframework.boot.autoconfigure.condition.OnPropertyListCondition
类。例如,如果你想检查service
属性是否至少有一个值:请参阅org.springframework. Boot .autoconfigure.webservices.WebServicesAutoConfiguration#wsdlDefinitionBeanFactoryPostProcessor上使用的org.springframework.boot.autoconfigure.webservices.OnWsdlLocationsCondition,以获取Spring本身的示例。
xxe27gdn3#
老问题了,但我希望我的回答能对Spring2.x有所帮助:感谢@Brian,我查看了迁移指南,在那里我受到了示例代码的启发。这段代码对我很有效:
我确实尝试获取POJO的列表(作为AutoConfigureService),但我的类与AutoConfigureServices不同。为此,我使用了:
继续玩:D
ki1q1bka4#
下面是我对这个问题的看法,在Spring自动配置中使用自定义条件。有点类似于@Strumbels提出的,但更可重用。
@Conditional
注解在应用程序启动的早期执行。属性源已加载,但尚未创建ConfgurationProperties bean。但是,我们可以通过将属性绑定到JavaPOJO来解决这个问题。首先,我介绍一个功能接口,这将使我们能够定义任何自定义逻辑检查,如果属性实际上存在与否。在你的例子中,这个方法将负责检查属性List是否为空/null,以及其中的所有项是否有效。
现在让我们创建一个annotation,它将使用Spring
@Conditional
进行metannotated,并允许我们定义自定义参数。prefix
表示属性名称空间,targetClass
表示属性应Map到的配置属性模型类。现在是主要部分。自定义条件实现。
现在,您应该创建自己的配置属性类,实现
OptionalProperties
接口。然后在Spring
@Configuration
类中。这种解决方案有两个缺点:
@ConfigurationProperties
注解上和在@ConditionalOnConfigurationProperties
注解上。通过在配置属性POJO中定义一个public static final String PREFIX = "namespace"
,可以部分缓解这种情况。lhcgjxsq5#
据我所知,你的问题是如何验证必填字段,我的建议是使用@ConfigurationProperties(“root”)注解,然后像这样将所有字段添加为@NotNull:
如果你更喜欢继续使用条件方法,你可以使用ConditionalOnExpression,但是,应该注意项目的数量是无限的: