Tomcat与Weblogic JNDI查找

时间:2020-03-05 18:48:45  来源:igfitidea点击:

我们正在使用的Weblogic服务器已配置为允许JNDI数据源名称,例如" appds"。

对于开发(本地主机),我们可能正在运行Tomcat,并且在server.xml的<context>部分中声明时,Tomcat会将JNDI数据源挂在JNDI树中的" java:comp / env / jdbc / *"上。

问题:在Weblogic中,JNDI查找是" appds",而在Tomcat中,看来我必须提供正式的" java:comp / env / jdbc / appds"。恐怕Tomcat版本是一个隐式标准,但是不幸的是,我无法更改Weblogic的配置...,这意味着我们最终只能使用两个不同的spring配置文件(我们使用的是spring 2.5)来适应不同的环境。

有没有一种优雅的方式来解决这个问题。我可以直接在Tomcat中查找JNDI名称吗? Spring可以在两个地方取一个名字和外观吗? Google搜索或者建议会很棒。

解决方案

回答

环境变量如何?将开发人员机器设置为tomcat名称,将生产机器设置为Weblogic名称。我们甚至可以将代码设置为使用默认代码(WebLogic),以防变量不存在。

回答

我的应用程序也有类似的问题,这就是我解决的方法:

1)WEB-INF / classes / application.properties包含以下条目:

ds.jndi=java:comp/env/jdbc/tcds

2)在WLS机器上,我在/ etc / sysenv文件中有一个条目:

ds.jndi=wlsds

3)我配置了spring,以使用PropertyPlaceholderConfigurer bean和classpath:application.properties和file:/ etc / sysenv作为位置,通过属性$$ {ds.jndi}查找JNDI。我还将" ignoreResourceNotFound"设置为" true",以便开发人员无需在其计算机上安装" / etc / sysenv"。

4)我使用Cargo + Jetty进行了集成测试,但无法在那里正确设置JNDI环境。所以我也使用JndiObjectFactoryBean的defaultObject属性配置了一个备用BasicDataSource。

回答

JndiLocatorSupport具有属性resourceReference。设置为true时,将自动在前面加上" java:comp / env /"前缀。因此,我认为从Tomcat迁移到Weblogic时区分该参数是正确的。

回答

我们在春季如何引用资源?

这就是tomcat的功能:

语境:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

春天:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

jee命名空间来自:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

回答

我已经使用Spring在Tomcat和WebLogic中解决了这个问题。这是它对我的工作方式的描述。

回答

如何在Web应用程序中使用单个JNDI名称

我本人为此已经挣扎了几个月。最好的解决方案是使应用程序具有可移植性,以便在Tomcat和Weblogic中具有相同的JNDI名称。

为了做到这一点,我们可以将" web.xml"和" spring-beans.xml"更改为指向单个jndi名称,并提供到每个供应商特定的jndi名称的映射。

我已将每个文件放在下面。

你需要:

  • web.xml中的&lt;resource-ref />条目,供应用使用单个名称
  • 文件" WEB-INF / weblogic.xml",用于将jndi名称映射到WebLogic管理的资源

通常,最好在应用中使用jndi名称,例如" jdbc / MyDataSource"和" jms / ConnFactory",并避免在其前加上" java:comp / env /"前缀。

而且,数据源和连接工厂最好由容器管理,并与JNDI一起使用。在应用程序中实例化数据库连接池是一个常见的错误。

春天

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF / context.xml(对于Tomcat)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>