Spring MVC-Tomcat GlobalNamingRessource-数据源NameNotFoundException

时间:2018-08-24 16:21:02

标签: spring-mvc jndi tomcat8

我已经阅读了许多有关此问题的主题,但仍无法解决。我有这个错误

Caused by: javax.naming.NameNotFoundException: Name [jdbc/dbName] not bound to this context

我有tomcat 8.5 server.xml:

<GlobalNamingResources>
    <Resource auth="Container"       
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
              name="UserDatabase" 
              pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />

    <Resource auth="Container" 
              driverClassName="oracle.jdbc.OracleDriver" 
              maxActive="10" 
              maxIdle="5" 
              maxWait="-1" 
              name="jdbc/dbName" 
              password="12345" 
              type="javax.sql.DataSource"        
              url="jdbc:oracle:thin:@(DESCRIPTION =   (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1234))    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1234))    (LOAD_BALANCE = yes)(CONNECT_DATA =(SERVICE_NAME = ABCDEF)    (FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC))))" 
              username="abcdef" />

我在名为“框架”的第一个应用程序中拥有main.java.DataConfig类:

@Configuration
@EnableTransactionManagement
@MapperScan("main.java.mapper")
public class DataConfig {
    @Autowired
    private ResourceLoader resourceLoader;
    /**
     * dataSource
     * @return
     */
    @Bean(destroyMethod = "")
    public DataSource dataSource() {
        JndiDataSourceLookup jndi = new JndiDataSourceLookup();
        return jndi.getDataSource("java:comp/env/jdbc/dbName");
    }
    ...

我将此应用打包为战争,并将其设置为另一个应用的覆盖。因此,在此应用程序中,我有一个像这样的META-INF / context.xml文件:

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

应用程序可以使用Maven正常运行,并且在战争中可以很好地包装所需的依赖项,但是,应用程序找不到GlobalNamingResource“ dbName”。

现在,如果我将GlobalNamingResource放在Tomcat的context.xml中,则可以找到数据源,并且一切正常。

但是我不想(也不能)更改服务器的context.xml,所以我想获取数据源并将其原样放置在server.xml中。如何成功做到这一点?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试以下设置,在我当前的项目中可以正常工作。

<bean id="dataSource"
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/dbName" />
    </bean>