Primavera Boot - Ambiente @Autowired lança NullPointerException

votos
11

Eu tenho uma configuração projeto usando Primavera Bota 0.5.0.M5 .

Em um dos arquivos de configuração Eu estou tentando @Autowire Environment, mas que falha com um NullPointerException.

Aqui está o que eu tenho até agora:

Application.java

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

JpaConfig.java onde eu estou tentando@Autowire Environment

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = com.ui.persistence.repository)
public class JpaConfig {
    private static final String DATABASE_DRIVER = db.driver;
    private static final String DATABASE_PASSWORD = db.password;
    private static final String DATABASE_URL = db.url;
    private static final String DATABASE_USERNAME = db.username;
    private static final String HIBERNATE_DIALECT = hibernate.dialect;
    private static final String HIBERNATE_SHOW_SQL = hibernate.show_sql;
    private static final String ENTITYMANAGER_PACKAGES_TO_SCAN 
        = entitymanager.packages.to.scan;

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty(DATABASE_DRIVER));
        dataSource.setUrl(env.getProperty(DATABASE_URL));
        dataSource.setUsername(env.getProperty(DATABASE_USERNAME));
        dataSource.setPassword(env.getProperty(DATABASE_PASSWORD));
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean 
                = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(
                HibernatePersistence.class);
        entityManagerFactoryBean.setPackagesToScan(
                env.getProperty(ENTITYMANAGER_PACKAGES_TO_SCAN));
        entityManagerFactoryBean.setJpaProperties(hibernateProperties());
        return entityManagerFactoryBean;
    }
}

Estou tentando carregar as propriedades do banco de dados configurados em um arquivo de propriedades. No entanto, o Environmentnão é injectada e o código de falha com NullPointerException. Eu não tenho qualquer configuração em arquivos XML.

Para o arquivo de propriedades Tenho configurado PropertySourcesPlaceholderConfigurerda seguinte maneira:

@Configuration
@PropertySource(classpath:database.properties)
public class PropertyConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

Eu tentei troca @Autowired, @Resourcee @Inject, mas nada tem funcionado até agora. Gostaria de receber qualquer ajuda. Obrigado.

Publicado 18/10/2013 em 17:14
fonte usuário
Em outras línguas...                            


4 respostas

votos
4

Eu acredito que houve alguns problemas de ciclo de vida com Primavera e o EntityManagerFactory, e você poderia ter caído em desgraça com aqueles (fixo no 4.0.0.RC1) - se sua @Configurationclasse é instanciado super cedo, pode não ser elegível para autowiring. Provavelmente, você pode dizer a partir da saída do log se esse for o caso.

Só por curiosidade, você sabia que a funcionalidade fornecida pelo seu JpaConfige PropertyConfigjá está presetn fora da caixa, se você usar @EnableAutoConfiguration(o tempo que @ComponentScano pacote onde seus repositórios são definidas)? Veja a amostra JPA na Primavera de inicialização para um exemplo.

Respondeu 04/11/2013 em 15:31
fonte usuário

votos
17

Embora o seu problema específico é resolvido, aqui está como obter Environmentem caso autowiring da Primavera acontece tarde demais .

O truque é implementar org.springframework.context.EnvironmentAware; Mola, em seguida, passa para o ambiente setEnvironment()método. Isso funciona desde a Primavera 3.1.

Um exemplo:

@Configuration
@PropertySource("classpath:myProperties.properties")
public class MyConfiguration implements EnvironmentAware {

    private Environment environment;

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

    public void myMethod() {
        final String myPropertyValue = environment.getProperty("myProperty");
        // ...
    }

}

Isto não é tão elegante como @Autowireou @Value, mas funciona como solução alternativa em algumas situações.

Respondeu 06/01/2015 em 10:28
fonte usuário

votos
0

Eu tive o mesmo problema em Spring Batch. Escritores não pode autowire classe Environment porque a classe de configuração foi instanciado antes. Então, eu criei uma espécie de Singleton (maneira de idade) para instanciar Ambiente e eu poderia acessar a ele todas as vezes.

Eu fiz esta implementação:

@Configuration
@PropertySource(value = { "classpath:kid-batch.properties" }, ignoreResourceNotFound = false)
public class BatchConfiguration implements EnvironmentAware {

private static Environment env;

public static String getProperty(String key) {
    return env.getProperty(key);
}

@Override
public void setEnvironment(Environment env) {
    BatchConfiguration.env = env;
}

}

E funciona

Respondeu 09/03/2018 em 11:06
fonte usuário

votos
0

Eu estava tendo o problema semelhante para ler as propriedades de meu arquivo application.properties em aplicativo de inicialização primavera. Lutei muito para descobrir o problema e fazer o trabalho. Finalmente eu fiz. Aqui é a minha Constantes classe que irá ler valores de propriedades de arquivo de propriedades. Espero que ele vai ajudar a alguém.

import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:application.properties")
public class Constants implements EnvironmentAware {

static Environment environment;

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

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
    return new PropertySourcesPlaceholderConfigurer();
}

public static String getActiveMQHost() {
    System.out.println(environment.getProperty("spring.activemq.broker-host"));
    return environment.getProperty("spring.activemq.broker-host");
}

public static String getActiveMQPort() {
    System.out.println(environment.getProperty("spring.activemq.broker-port"));
    return environment.getProperty("spring.activemq.broker-port");
}

public static String getActiveMQUser() {
    System.out.println(environment.getProperty("spring.activemq.user"));
    return environment.getProperty("spring.activemq.user");
}

public static String getActiveMQPassword() {
    System.out.println(environment.getProperty("spring.activemq.password"));
    return environment.getProperty("spring.activemq.password");
}

}

Estes são a chave de propriedade de declarada em meus application.properties,

spring.activemq.broker-host
spring.activemq.broker-port
spring.activemq.user
spring.activemq.password
Respondeu 28/08/2018 em 09:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more