Бин находится в applicationContext, но аннотация @Autowired не работает - PullRequest
0 голосов
/ 21 февраля 2019

Источник данных бина находится на моей фабрике бинов, но я получил NPE, когда попытался получить доступ к методу источника данных.Кажется, что @Autowired аннотация не работает

@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {

    @Autowired
    private DataSource dataSource;

    public static void main(String[] args) throws SQLException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        showBeans(context);
        dataSourceDemo();
    }

    private static void showBeans(ApplicationContext context) {
        System.out.println(Arrays.toString(context.getBeanDefinitionNames()));
    }

    private static void dataSourceDemo() throws SQLException {
        DataSourceConfiguration demo = new DataSourceConfiguration();
        demo.showDataSource();
    }

    @Bean(destroyMethod = "close")
    public DataSource dataSource() throws Exception {
        Properties properties = new Properties();
        properties.setProperty("driverClassName", "com.mysql.jdbc.Driver");
        properties.setProperty("url", "jdbc:mysql://127.0.0.1:3306/orange?characterEncoding=utf-8");
        properties.setProperty("username", "mysql");
        properties.setProperty("password", "123456");
        return BasicDataSourceFactory.createDataSource(properties);
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource());
//        return new DataSourceTransactionManager(dataSource);
    }

    public void showDataSource() throws SQLException {
        System.out.println("dataSource: " + dataSource.toString());
        Connection connection = dataSource.getConnection();
        System.out.println("connection: " + connection.toString());
        connection.close();
    }


}

И я запускаю программу и получаю вывод, как показано ниже:

Exception in thread "main" java.lang.NullPointerException
at com.pain.DataSourceConfiguration.showDataSource(DataSourceConfiguration.java:40)
at com.pain.DataSourceTest.dataSourceDemo(DataSourceTest.java:23)
at com.pain.DataSourceTest.main(DataSourceTest.java:14)

[dataSourceConfiguration, org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration, org.springframework.transaction.config.internalTransactionAdvisor, TransactionsAttributeSource, TransactionsInterceptor, org.springframework.transaction.config.internalTransactionalEventListenerFactory, dataSource, TransactionsManager, org.springframework.aop.config.internalAutoProxyCreator]

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

В качестве примера: наличие драйвера вашей программы в классе @Configuration и создание экземпляра этого класса вручную кажется неправильным!

В вашем классе конфигурации должны быть сконфигурированы в основном bean-компоненты, поэтому он должен выглядеть следующим образом:

@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {

    @Autowired
    private DataSource dataSource;

    @Bean(destroyMethod = "close")
    public DataSource dataSource() throws Exception {
        Properties properties = new Properties();
        properties.setProperty("driverClassName", "com.mysql.jdbc.Driver");
        properties.setProperty("url", "jdbc:mysql://127.0.0.1:3306/orange?characterEncoding=utf-8");
        properties.setProperty("username", "mysql");
        properties.setProperty("password", "123456");
        return BasicDataSourceFactory.createDataSource(properties);
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource());
    }
}

Если вы используете обычную пружину, вы можете выполнить то, что вы хотите, показывая информацию об источнике данных, делая что-то вроде следующего.Использование Spring в качестве сервисного локатора таким способом довольно недиоматично и, возможно, даже анти-паттерн):

public class MainCaller {

    public static void main(String[] args) {

       ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");
       DataSource ds = (DataSource)applicationContext.getBean("DataSource");
       showDataSource(ds);

    }
     public static void showDataSource(Datasource dataSource) throws SQLException {
        System.out.println("dataSource: " + dataSource.toString());
        Connection connection = dataSource.getConnection();
        System.out.println("connection: " + connection.toString());
        connection.close();
    }

}
0 голосов
/ 21 февраля 2019

Ваша проблема заключается здесь:

DataSourceConfiguration demo = new DataSourceConfiguration();

Вы создаете объект вручную, не используя Spring AOP.Таким образом, DataSourceConfiguration не включается в прокси-сервер, и управление зависимостями завершается неудачей.

Чтобы решить эту проблему, вам нужно @Autowire это где-то еще, вне статического контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...