web-dev-qa-db-fra.com

L'environnement câblé automatiquement est nul

J'ai un problème avec la connexion de l'environnement à mon projet Spring. Dans cette classe

@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);
    }
}

l'environnement est toujours nul.

35
LeYar

Le câblage automatique se produit plus tard que load() est appelée (pour une raison quelconque).

Une solution consiste à implémenter EnvironmentAware et à s'appuyer sur Spring appelant la méthode 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);
    }
}
31
Alex Shesterov

Changement @Autowired pour @Resource (à partir de javax.annotation) et faites-le public par exemple:

@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;
    }
}

Et vous devez enregistrer votre classe de configuration dans WebApplicationInitializer de cette façon

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(ApplicationConfigurer.class); //ApplicationConfigurer imports HibernateConfigurer

Ça marche pour moi! Vous voudrez peut-être vérifier n projet de test que j'ai fait .

15
Josue Montano