首页 > 解决方案 > Spring:使用@Validated注解时,自动装配的配置为空

问题描述

通常我使用一个类从 yml 加载所有配置,并通过自动装配配置使它们在整个应用程序中可用。这工作得很好,直到我尝试通过添加 @Validated 注释来验证配置。

如果验证失败,应用程序将无法启动,并且我收到一条消息,其中包含错误设置的属性。如果验证成功,我的自动装配配置为空,即使我可以通过调试看到正确的值是从 yml 文件中读取和设置的。

//full configuration class
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;

@Component
@ConfigurationProperties(prefix = "config")
@Validated
public class ConfigurationStore {

    @Valid
    public MyConfiguration myConfiguration = new MyConfiguration();

    public ConfigurationStore setMyConfiguration(MyConfiguration myConfiguration) {
        this.myConfiguration = myConfiguration;
        return this;
    }

    public static class MyConfiguration {

        @NotBlank
        public String configuredString;

        public void setConfiguredString(String configuredString) {
            this.configuredString = configuredString;
        }
    }

}
//class where autowired configuration is always null
import {package}.ConfigurationStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(ConfigurationStore.class)
public class MyConfig {

    private ConfigurationStore configurationStore;

    @Autowired
    public MyConfig(ConfigurationStore configurationStore) {
        this.configurationStore = configurationStore;
    }

    @Bean
    public String returnIt() {
        return configurationStore.myConfiguration.configuredString;
    }
}

删除 @Validated 会删除验证功能。保留它会导致自动装配配置为空。我期望的是配置和验证同时工作。

标签: javaspringvalidation

解决方案


推荐阅读