忽略Spring Boot 2中ConfigurationProperties的未绑定属性

时间:2018-09-06 08:20:00

标签: java spring spring-boot

我的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;
    }
}

有什么办法可以避免这种情况吗?

0 个答案:

没有答案