Удаленный JNDI + Spring Boot + WebLogic, как указать контекст из application.property? - PullRequest
0 голосов
/ 15 мая 2018

Я занимаюсь разработкой проекта в Spring Boot и Spring Data, я хочу использовать JNDI с удаленного сервера WebLogic.

У меня есть старый пример, который не использует Spring, он делает это следующим образом:

DataSource pool = null; Hashtable ht = null;
ht = new Hashtable( );
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://192.151.120.180:7003,192.151.121.180:7005");
ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
env =  new InitialContext(ht);
pool = (DataSource) env.lookup("jdbc.conPesos");

Я хочу сделать то же соединение, но из application.property файла (или application.yml файла) с Spring Boot.

Это мой код:

 spring:
     datasource:
         driver-class-name: oracle.jdbc.OracleDriver
         url: t3://192.151.120.180:7003
         jndi-name: java:/comp/env/jdbc/conPesos

Я получил ошибку:

Ошибка создания компонента с именем 'dataSource', определенным в ресурсе пути к классу [----]: Не удалось создать экземпляр компонента с помощью метода фабрики;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [javax.sql.DataSource]: фабричный метод 'dataSource' вызвал исключение;вложенное исключение: org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: не удалось найти JNDI DataSource с именем 'java: / comp / env / jdbc / conPesos';вложенным исключением является javax.naming.NoInitialContextException: необходимо указать имя класса в свойстве среды или системы, либо в качестве параметра апплета, либо в файле ресурсов приложения: java.naming.factory.initial

КомуЧтобы исправить ошибку, я создал класс @configuration со следующим кодом:

 @Bean public DataSource dataSource() throws NamingException {
     Context ctx ;
     DataSource dataSource;
     Hashtable<String, String> ht;
     NamedParameterJdbcTemplate np;

     ht = new Hashtable<>();
     ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
     ht.put(Context.PROVIDER_URL, "t3://192.151.120.180:7003");
     ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
     ctx = new InitialContext(ht);

     dataSource=(DataSource) ctx.lookup("jdbc.conPesos");
     return dataSource; }

Также мне пришлось написать SpringBootApplication(exclude = JmxAutoConfiguration.class) в основном классе.Это работает нормально, однако я хотел бы сделать это из файла application.property, но я не знаю, как я могу добавить свойство INITIAL_CONTEXT_FACTORY в этот файл.

Кто-то знает это?

1 Ответ

0 голосов
/ 03 августа 2018

Я могу решить проблему из конфигурации класса ( Я не смог сделать это из файла application.property). Со следующим кодом:

@Bean(name = "conProcesosDS")
    public DataSource dataSourceProcesos() throws NamingException {
        Context ctx;
        DataSource dataSource;
        Hashtable<String, String> ht;

        ht = new Hashtable<>();
        ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        ht.put(Context.PROVIDER_URL, "t3://192.151.120.180:7003");
        ht.put(weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true");
        ctx = new InitialContext(ht);

        dataSource = (DataSource) ctx.lookup("jdbc.conPesos");
        return dataSource;
    }

Вы должны добавить библиотеку wlfullclient-10.1.0.1.jar . У Maven нет библиотеки, вы должны найти ее в Интернете и добавить в проект. (Я создал локальный репозиторий с Nexus).

Я также добавил аннотацию @SpringBootApplication (exclude = JmxAutoConfiguration.class) в основной класс. Как это:

@SpringBootApplication(exclude = JmxAutoConfiguration.class)
public class Aplicacion extends SpringBootServletInitializer implements WebApplicationInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Aplicacion.class);
    }

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