默认情况下,JNDI在嵌入式Tomcat中处于禁用状态,这会导致
NoInitialContextException。您需要致电
Tomcat.enableNaming()将其启用。最简单的方法是使用
TomcatEmbeddedServletContainer子类:
@Beanpublic TomcatEmbeddedServletContainerFactory tomcatFactory() { return new TomcatEmbeddedServletContainerFactory() { @Override protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer( Tomcat tomcat) { tomcat.enableNaming(); return super.getTomcatEmbeddedServletContainer(tomcat); } };}如果采用这种方法,则也可以
DataSource通过重写子类中的
postProcessContext方法在JNDI中注册
TomcatEmbeddedServletContainerFactory。
context.getNamingResources().addResource将资源的
java:comp/env背景下,因此资源的名称应该是
jdbc/mydatasource没有
java:comp/env/mydatasource。
Tomcat使用线程上下文类加载器来确定应针对哪个JNDI上下文执行查找。您将资源绑定到Web应用程序的JNDI上下文中,因此需要确保在Web应用程序的类加载器是线程上下文类加载器时执行查找。您应该可以通过将设置
lookupOnStartup为来实现此
false目的
jndiObjectFactoryBean。您还需要设置
expectedType为
javax.sql.DataSource:
<bean > <property name="jndiName" value="java:comp/env/jdbc/mydatasource"/> <property name="expectedType" value="javax.sql.DataSource"/> <property name="lookupOnStartup" value="false"/></bean>
这将为DataSource创建代理,并在首次使用时而不是在应用程序上下文启动期间执行实际的JNDI查找。
在Spring Boot示例中说明了上述方法。



