0

私の症状は次のようなものです: 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 リソース定義のドキュメントを読みましたが、まとめることはできませんでした.. .

抜けているものがあれば教えてください

4

1 に答える 1

0

私も同じ問題を抱えていました。まず、JndiObjectFactory の jndiName を変更してみることをお勧めします。hereで説明されているように、java:comp/env/jdbc/myDataSource ではなく、jdbc/myDataSource である必要があります。登録により、リソースが java:comp/env/ の下に自動的に配置されるようです。それは私のために働いた。

application.propertiesでデータ ソースを定義することもできます。

spring.datasource.jndi-name=jdbc/myDataSource

Application クラス内で行う代わりに:

@Bean(destroyMethod="")
public DataSource jndiDataSource() {
...
   bean.setJndiName("jdbc/myDataSource");
...
}

私のエラーを解決するには、複製した例とは異なる依存関係も使用する必要がありました。私は tomcat 8.0.23 から 7.0.56 に、そして tomcat-dbcp 7.0.47 に切り替えました:

親ポン

<properties>
    <java.version>1.7</java.version>
    <tomcat.version>7.0.56</tomcat.version>
    <boot.version>1.2.5.RELEASE</boot.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <start-class>com.My_App</start-class>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>${start-class}</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>${boot.version}</version>
            <configuration>
                <downloadSources>true</downloadSources>
                <downloadJavadocs>true</downloadJavadocs>
            </configuration>
        </plugin>
    </plugins>
</build>
<repositories>
    <repository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>

フルポン:

<parent>
    <groupId>com</groupId>
    <artifactId>WebModule</artifactId>
    <version>1.2-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
            <exclusion>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <groupId>org.springframework.boot</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>       
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>7.0.56</version><!--$NO-MVN-MAN-VER$--> 
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-el</artifactId>
        <version>7.0.56</version><!--$NO-MVN-MAN-VER$--> 
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-juli</artifactId>
        <version>7.0.56</version><!--$NO-MVN-MAN-VER$--> 
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-websocket</artifactId>
        <version>7.0.56</version><!--$NO-MVN-MAN-VER$--> 
    </dependency>
    <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-dbcp</artifactId> 
        <version>7.0.47</version> 
        <scope>provided</scope>
    </dependency>     
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

瓶の違いにより、別のクラスを使用する必要がありました

// import org.apache.tomcat.util.descriptor.web.ContextResource;
import org.apache.catalina.deploy.ContextResource;
于 2015-10-10T05:12:29.620 に答える