Spring Boot Weblogic 12c JNDI DataSources: инъекция не работает дает исключение NullPointerException - PullRequest
1 голос
/ 01 июля 2019

Я задал вопрос здесь, но он был неполным и был отмечен как дубликат здесь

Итак, основываясь на уже заданном вопросе, один конкретный ответ @ surasin-tancharoen, похоже, былМне нужно.

Однако, попытка это тоже дает мне NullPointerException, так как источник данных никогда не создается / вводится.

Вот подробности:

В приведенном ниже кодеЯ определил 2 бобов.Я определил оба источника данных с аннотацией @Qualifier и @ConfigurationProperties для чтения имени JNDI из файла свойств.

@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    @Qualifier("ds1")
    @ConfigurationProperties(prefix="spring.datasource1")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Qualifier("ds2")
    @ConfigurationProperties(prefix="spring.datasource2")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

В application.properties:

spring.datasource1.jndi-name=AbcDS
spring.datasource2.jndi-name=XyzDS

Затем в моем DAO- Я пытаюсь использовать этот источник данных:

@Autowired
@Qualifier("ds1")
DataSource dataSource;

Однако источник данных не внедряется, поскольку я получаю NullPointerException в этой строке кода:

conn = dataSource.getConnection();

Все этопри попытке развернуть приложение Spring Boot на Weblogic 12c

1 Ответ

1 голос
/ 02 июля 2019

Решение связано с неправильным использованием DataSourceBuilder, который не должен использоваться для источника данных JNDI.

Вот как я его получил: (развертывание весенней загрузки на weblogic и использование источников данных, определенных вweblogic)

Сначала мы указываем источники данных, определенные в weblogic - здесь мы указываем имя JNDI источников данных, определенных в weblogic:

spring.datasource.xyz.jndi-name=XYZDS
spring.datasource.test.jndi-name=TESTDS

Здесь источник данных создается с использованием определенных выше свойстви выставлено: Мы внедряем свойства из application.properties в строковые переменные для хранения имен источников данных JNDI.

@Configuration
public class DataSourceConfig {

@Value( "${spring.datasource.xyz.jndi-name}" )
private String xyzJndiName;

@Value( "${spring.datasource.test.jndi-name}" )
private String testJndiName;

@Bean(name = "XyzDataSource")
public DataSource getXyzDataSource() throws Exception {        
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    return dataSourceLookup.getDataSource(xyzJndiName);
}   

@Bean(name = "TestDataSource")
public DataSource getTestDataSource() throws Exception {        
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    return dataSourceLookup.getDataSource(testJndiName);
}  

Несколько ключевых моментов, на которые следует обратить внимание: Мы не должны использовать 'DataSourceBuilder' для источника данных JNDI - он не будет работать.

По этой причине он не работал в моем случае.

Теперь я использую ' JndiDataSourceLookup ', который делает свое дело.

Еще одна вещь, на которую следует обратить внимание, это то, что нам нужно использовать стандартный аннотат @BeanИон с атрибутом «имя».

Это будет важно в части кода, которая использует этот источник данных.Итак, теперь источники данных созданы успешно и предоставлены.

ОК время для использования:

@Repository
public class SomeDaoImpl {

@Autowired
@Qualifier("XyzDataSource")
DataSource dataSource;

@Override
public List <String> create(Employee request) {

    Connection conn = null;
    conn = dataSource.getConnection();

Здесь мы используем аннотацию @ Qualifier , чтобы подобрать соответствующий источник данных.Вот и все - теперь это работает.Я попробовал это с другим источником данных - это также сработало.

ПРИМЕЧАНИЕ: Я не хотел бы принимать свой собственный ответ - поэтому я подожду пару дней, если кто-нибудь ещеесть лучшее и более элегантное решение, пожалуйста, ответьте - будем рады принять ваш ответ, а не отвечать на мой собственный вопрос и принимать!

...