我的application.yml文件中存在未绑定属性的问题。我正在从Spring Boot 1.5.4迁移到Spring Boot 2。 我的问题是我有一些可以随意留空的属性,例如:
application.yml
app:
enabled: false
url: #ldap://127.0.0.1:3268
user: #admin
在这种情况下,如果ldap.enabled
设置为true
,则ldap
属性可以设置为当前已注释掉的所需值。但是,如果将ldap.enabled
设置为false
,则其余属性未设置并且留空。
在Spring Boot 1.5.4应用程序中,我对此没有任何问题,但是现在升级到Spring Boot 2之后,我得到以下异常:
org.springframework.boot.context.properties.bind.UnboundConfigurationPropertiesException: The elements [ldap.ignorecertificate] were left unbound.
org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'ldap' to com.myapp.server.config.properties.LdapProperties
LdapProperties.java
@Component
@ConfigurationProperties(prefix = "app", ignoreUnknownFields = false)
@Getter
@Setter
public class AppProperties {
private Boolean enabled;
private String url;
private String user;
}
我知道我可以在ignoreUnvalidFields = true
中设置@ConfigurationProperties
,但这并不是我想要的行为,因为在我的情况下,空值是有效的。
有没有一种方法可以忽略未绑定的属性?我该怎么做才能避免这个问题?
更新
进一步调试后,我可以看到,因为ignoreUnkownFields = false
中的@ConfigurationPropertes
然后返回了NoUnboundElementsBindHandler
,它检查未绑定的属性:
class ConfigurationPropertiesBinder {
private final ApplicationContext applicationContext;
private final PropertySources propertySources;
private final Validator configurationPropertiesValidator;
private final boolean jsr303Present;
private volatile Validator jsr303Validator;
private volatile Binder binder;
...
...
...
private BindHandler getBindHandler(ConfigurationProperties annotation,
List<Validator> validators) {
BindHandler handler = new IgnoreTopLevelConverterNotFoundBindHandler();
if (annotation.ignoreInvalidFields()) {
handler = new IgnoreErrorsBindHandler(handler);
}
if (!annotation.ignoreUnknownFields()) {
UnboundElementsSourceFilter filter = new UnboundElementsSourceFilter();
handler = new NoUnboundElementsBindHandler(handler, filter);
}
if (!validators.isEmpty()) {
handler = new ValidationBindHandler(handler,
validators.toArray(new Validator[0]));
}
return handler;
}
}
有什么办法可以避免这种情况吗?