私の症状は次のようなものです: Tomcat コンテナーが組み込まれた Spring Boot で JNDI コンテキストを作成する方法
問題を再現するgithub リポジトリを作成しました: https://github.com/Rkiouak/spring-boot-embedded-tomcat-hibernate-jndiパブリック Maven リポジトリへの jar)
リポジトリのクローンを作成し、そこに cd して mvn clean && mvn package && java -jar target/spring-boot-sample-tomcat-jndi-0.1.0-SNAPSHOT.jar を実行すると、NameNotFound execption が再現されます。
tomcat 8 と最新の spring-boot バージョンを jndi で使用するために変更する必要がある構成を理解するのを手伝ってくれる人はいますか?
問題の詳しい説明:
以前の回答の解決策はうまくいきませんでした。新しいバージョンの依存関係の問題、または休止状態が jndi ルックアップを実行する方法/時期に関係があると思われます。
ただし、https://github.com/wilkinsona/spring-boot-sample-tomcat-jndiのクローンを作成し、Spring Boot の依存関係を LATEST に更新し、この新しいバージョンから生じる tomcat パッケージ/インポートを更新し、Tomcat 7 から移行しました。 Tomcat 8にインストールして実行しました。
例外のマニフェストは同じですが、私の問題は少し異なると思います。
私が受け取る例外は次のとおりです。
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 47 more
Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/MyDataSource]
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:100)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:98)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
... 65 more
Caused by: javax.naming.NameNotFoundException: Name [comp/env/jdbc/MyDataSource] is not bound in this Context. Unable to find [comp].
at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:134)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:97)
... 74 more
私はレガシー Struts アプリを Spring MVC に移行する作業を行っています。最終的には、これらの jndi リソース ルックアップを (少なくとも私が知っている) 伝統的に定義されたデータソースに変更する予定ですが、現時点ではその手順を避けたいと考えています。
applicationContext.xml リソースをインポートしています。
@Configuration
@ComponentScan
@EnableAutoConfiguration
@ImportResource("classpath:context/applicationContext.xml")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
ContextResourceLink resourceLink = new ContextResourceLink();
resource.setName("jdbc/MyDataSource");
resource.setProperty("global", "jdbc/MyDataSource");
resource.setType("javax.sql.DataSource");
resource.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
resource.setProperty("url", "jdbc:yourDb");
resource.setAuth("Container");
context.getNamingResources().addResource(resource);
resourceLink.setName("jdbc/MyDataSource");
resourceLink.setType("javax.sql.DataSource");
resourceLink.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
resourceLink.setProperty("url", "jdbc:connectionString");
context.getNamingResources().addResourceLink(resourceLink);
System.out.println("\n\n\ncontext naming resources\n"+context.getResourceOnlyServlets()+"\n\n\n");
}
};
}
@Bean(destroyMethod="")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
System.out.println("\n\n\nIn jndiDataSource\n\n\n");
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName("java:comp/env/jdbc/MyDataSource");
bean.setProxyInterface(oracle.jdbc.driver.OracleDriver.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource)bean.getObject();
}
}
リソース applicationContext.xml は、次のような hibernate.cfg.xml ファイルを参照する hibernateContext.xml を参照します。
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/jdbc/MyDataSource</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<property name="hibernate.max_fetch_depth">2</property>
.....
からのprintlnが表示されません
@Bean(destroyMethod="")
public DataSource jndiDataSource()...
豆。私は見ます:
Name = MyDataSource Ignoring unknown property: value of "jdbc/MyDataSource" for "global" property
これは有効でも有用でもない設定ですが、私が試したことの 1 つです。
これに対する 1) 原因と 2) 解決策を特定するための助けをいただければ幸いです。私はこれまで JNDI リソースを使用したことがなく、このアプリケーションのバックグラウンドは WAS でした。
spring-boot、hibernate、jndi、name not found の組み合わせに漠然と一致するスタック オーバーフローの質問のほとんどを調べ、Tomcat リソース定義のドキュメントを読みましたが、まとめることはできませんでした.. .
抜けているものがあれば教えてください