繁体   English   中英

远程 JNDI + Spring Boot + WebLogic,如何从 application.property 指定上下文?

[英]Remote JNDI + Spring Boot + WebLogic, How to specify the context from the application.property?

我正在 Spring Boot 和 Spring Data 中开发一个项目,我想使用来自 WebLogic 远程服务器的 JNDI。

我有一个不使用 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”的 bean 创建时出错:通过工厂方法的 Bean 实例化失败; 嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [javax.sql.DataSource]:工厂方法 'dataSource' 抛出异常; 嵌套异常是 org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException:无法查找名称为“java:/comp/env/jdbc/conPesos”的 JNDI 数据源; 嵌套异常是 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 属性。

有人知道吗?

请注意使用以下注释参数,否则 WebLogic 管理的数据源将在您的应用程序第一次停止/取消部署时被 Spring Boot 停止,并且在 WebLogic Server(JVM) 重新启动之前不会重新启动:

@Bean(destroyMethod = "")    

这将引发如下异常:

Caused by: java.sql.SQLException: DataSource jdbc/myDatasource is not active
    at weblogic.jdbc.common.internal.WLDataSourceImpl.checkActive(WLDataSourceImpl.java:596)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnectionInternal(WLDataSourceImpl.java:617)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnection(WLDataSourceImpl.java:611)
    at weblogic.jdbc.common.internal.WLDataSourceImpl.getConnection(WLDataSourceImpl.java:604)
    at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:108)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)

我可以从类配置中解决这个问题(我无法从 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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM