自动环境为空

LeY*_*Yar 37 java environment spring properties autowired

我将环境连接到Spring项目时遇到问题.在这堂课上

@Configuration
@ComponentScan(basePackages = "my.pack.offer.*")
@PropertySource("classpath:OfferService.properties")
public class PropertiesUtil {
    @Autowired
    private Environment environment;



    @Bean
    public String load(String propertyName)
    {
        return environment.getRequiredProperty(propertyName);
    }
}
Run Code Online (Sandbox Code Playgroud)

环境始终为null.

Ale*_*rov 33

自动装配发生的时间晚于load()调用(由于某种原因).

解决方法是实现EnvironmentAware并依赖Spring调用setEnvironment()方法:

@Configuration
@ComponentScan(basePackages = "my.pack.offer.*")
@PropertySource("classpath:OfferService.properties")
public class PropertiesUtil implements EnvironmentAware {
    private Environment environment;

    @Override
    public void setEnvironment(final Environment environment) {
        this.environment = environment;
    }

    @Bean
    public String load(String propertyName)
    {
        return environment.getRequiredProperty(propertyName);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在使用 Groovy 和 Spock 的测试环境中,无论我如何注释(Autowires、Inject、Resource),Spring 都以某种方式无法注入环境。按照 Alex 的建议实施 EnvironmentAware 是唯一的方法。 (2认同)

Jos*_*ano 15

更改@Autowired@Resource(从javax.annotation中),并使其public例如:

@Configuration
@PropertySource("classpath:database.properties")
public class HibernateConfigurer {

    @Resource
    public Environment env;

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("database.driverClassName"));
        dataSource.setUrl(env.getProperty("database.url"));
        dataSource.setUsername(env.getProperty("database.username"));
        dataSource.setPassword(env.getProperty("database.password"));
        dataSource.setValidationQuery(env.getProperty("database.validationQuery"));

        return dataSource;
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须以这种方式在WebApplicationInitializer中注册您的configurer类

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(ApplicationConfigurer.class); //ApplicationConfigurer imports HibernateConfigurer
Run Code Online (Sandbox Code Playgroud)

它对我有用!您可能想检查我制作的测试项目.


urs*_*rsa 5

我通过构造函数注入解决了同样的问题:

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfig {
    private Environment environment;

    public MyConfig(Environment environment) {
        this.environment = environment
    }

    @Bean
    public MyBean myBean() {
        return new MyBean(environment.getRequiredProperty("srv.name"))
    }
}
Run Code Online (Sandbox Code Playgroud)

后来,我将其简化为这种形式(以使属性正确注入):

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfig {
    private String serviceName;

    public MyConfig(Environment ignored) {
        /* No-op */
    }

    @Value("${srv.name}")
    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }

    @Bean
    public MyBean myBean() {
        return new MyBean(requireNonNull(serviceName)); // NPE without environment in constructor
    }
}
Run Code Online (Sandbox Code Playgroud)