Java Tomcat与Weblogic JNDI查找

Java Tomcat与Weblogic JNDI查找,java,tomcat,jakarta-ee,weblogic,jndi,Java,Tomcat,Jakarta Ee,Weblogic,Jndi,我们正在使用的Weblogic服务器已配置为允许使用JNDI数据源名称,如“appds” 对于开发(localhost),我们可能正在运行Tomcat,当在server.xml部分声明时,Tomcat将在JNDI树中的“java:comp/env/jdbc/*”上挂起JNDI数据源 问题:在Weblogic中,JNDI查找是“appds”,而在Tomcat中,似乎我必须提供正式的“java:comp/env/jdbc/appds”。我担心Tomcat版本是一个隐式标准,但不幸的是,我无法更改We

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

对于开发(localhost),我们可能正在运行Tomcat,当在server.xml部分声明时,Tomcat将在JNDI树中的“java:comp/env/jdbc/*”上挂起JNDI数据源

问题:在Weblogic中,JNDI查找是“appds”,而在Tomcat中,似乎我必须提供正式的“java:comp/env/jdbc/appds”。我担心Tomcat版本是一个隐式标准,但不幸的是,我无法更改Weblogic的配置。。。这意味着我们最终会得到两个不同的spring配置文件(我们使用的是Spring2.5)来简化不同的环境


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

环境变量怎么样?使用tomcat名称设置开发人员机器,使用Weblogic名称设置产品。您甚至可以将代码设置为在变量不存在的情况下使用默认代码(WebLogic)。

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

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

ds.jndi=java:comp/env/jdbc/tcds 3) 我将spring配置为使用
PropertyPlaceHolderConfigure
bean,将
classpath:application.properties
file:/etc/sysenv
作为位置,通过属性
${ds.JNDI}
查找JNDI。我还将
ignoreResourceNotFound
设置为
true
,这样开发人员的机器上就不需要
/etc/sysenv


4) 我使用Cargo+Jetty运行了一个集成测试,但我无法在那里正确设置JNDI环境。因此,我也使用
jndObjectFactoryBean
defaultObject
属性配置了一个后备
BasicDataSource
jndLocatorSupport
有一个属性
resourceRef
。设置为true时,将自动在“java:comp/env/”前缀前面加上前缀。因此,我认为在从Tomcat移动到Weblogic时,区分这个参数是正确的。

您在spring中是如何引用资源的

这是我们为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"/>

弹簧:

<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名称空间来自:


我已经通过使用Spring的Tomcat和WebLogic实现了这一技巧。是对它如何为我工作的描述。

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

我自己也为此挣扎了几个月。最好的解决方案是使应用程序可移植,以便在Tomcat和Weblogic中使用相同的JNDI名称

为了做到这一点,您将
web.xml
springbeans.xml
更改为指向单个jndi名称,并提供到每个特定于供应商的jndi名称的映射

我把每个文件都放在下面

你需要:

  • web.xml中的
    条目,用于应用程序使用单个名称
  • 用于将jndi名称映射到weblogic管理的资源的文件
    WEB-INF/weblogic.xml
  • 用于将jndi名称映射到Tomcat管理的资源的文件
    META-INF/context.xml
    • 这可以在Tomcat安装或应用程序中进行
作为一般规则,您更喜欢在应用程序中使用jndi名称,如
jdbc/MyDataSource
jms/ConnFactory
,并避免使用
java:comp/env/
作为前缀

此外,数据源和连接工厂最好由容器管理,并与JNDI一起使用。这是一个好主意

弹簧


web.xml


我的数据源
jdbc/appds
javax.sql.DataSource
容器
weblogic.xml


appds
jdbc/appds
META-INF/context.xml(用于Tomcat)


在应用程序本身中设置数据源并没有那么疯狂:)我想说,如果应用程序要部署在网格上,这甚至是强制性的。河流、千兆空间或类似空间

注意:我并不是说连接设置必须在WAR内部硬编码,它们需要在部署时/运行时提供。这简化了云实例的管理,因为只有现场可供配置

只有在容器中部署了多个应用程序并且它们可以使用共享资源时,在容器中配置资源才有意义


同样,在云类型的部署中,每个servlet容器实例只有一个应用程序

以下配置在Tomcat和Weblogic中对我有效

春天:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>


在Weblogic管理控制台中,创建名为
JDBC/AgriShare
的JDBC资源。在“Targets”下,确保将数据源定位到要将应用部署到的服务器!。这一点刚才花费了我一些时间…

为什么要使用ActiveMQ库连接到weblogic?是否无法配置tomcat,使其提供不带“java:comp/env/”的JNDI?是否无法配置tomcat,使其提供不带“java:comp/env/”的JNDI?否则,外部化的优势就会减少。。。
<?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>
<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>