質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

3917閲覧

SpringBootのEmbeddedTomcatでDataSourceにJNDIを使用したい。

fsk5303

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/08/13 07:11

編集2019/08/13 08:31

前提・実現したいこと

  • SpringBootを使用しWebサービスを開発する。DBはPostgreSQLを使用する。
  • DBアクセスする際のDataSourceにJNDIを使用したい。
  • 開発はSpringBootの組み込みTomcatを使用し、本番ではサーバ上のTomcatにwarファイルをデプロイして動作させたい。
  • ORMにはMybatisを使用し、EntityクラスとMapperはMybatisGeneratorで生成したものを使用する。

発生している問題・エラーメッセージ

サーバー上のTomcatにwarファイルをデプロイした場合は正常に動作するが、
組み込みTomcatで動作させる際、DBに問い合わせを行うと下記のエラーが表示される。

※組み込みTomcatを使用しない場合は正常にアクセスできているため、サーバー側のtomcatのcontext.xmlやserver.xmlは正しく設定できていると考えています。

error

1### Error querying database. Cause: org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.jdbc.pool.DataSourceFactory] 2### The error may exist in jp/co/example/testserver/mybatis/mapper/generated/TestTableMapper.xml 3### The error may involve jp.co.example.testserver.mybatis.mapper.generated.TestTableMapper.selectByPrimaryKey 4### The error occurred while executing a query 5### Cause: org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.jdbc.pool.DataSourceFactory]] with root cause 6 7java.lang.ClassNotFoundException: org.apache.tomcat.jdbc.pool.DataSourceFactory 8 at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:68) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE] 9 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) ~[tomcat-embed-core-9.0.22.jar:9.0.22] 10 at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:61) ~[tomcat-embed-core-9.0.22.jar:9.0.22] 11 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) ~ 12(省略)

該当のソースコード

  • pom.xml

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 <parent> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-parent</artifactId> 9 <version>2.1.7.RELEASE</version> 10 <relativePath /> <!-- lookup parent from repository --> 11 </parent> 12 <groupId>jp.co.example</groupId> 13 <artifactId>test-server</artifactId> 14 <version>0.0.1-SNAPSHOT</version> 15 <packaging>war</packaging> 16 <name>test-server</name> 17 <description>Demo project for Spring Boot</description> 18 19 <properties> 20 <java.version>1.8</java.version> 21 </properties> 22 23 <dependencies> 24 <dependency> 25 <groupId>org.springframework.boot</groupId> 26 <artifactId>spring-boot-starter-web</artifactId> 27 </dependency> 28 <dependency> 29 <groupId>org.mybatis.spring.boot</groupId> 30 <artifactId>mybatis-spring-boot-starter</artifactId> 31 <version>2.1.0</version> 32 </dependency> 33 <dependency> 34 <groupId>org.postgresql</groupId> 35 <artifactId>postgresql</artifactId> 36 <scope>runtime</scope> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-starter-tomcat</artifactId> 41 <scope>provided</scope> 42 </dependency> 43 <dependency> 44 <groupId>org.springframework.boot</groupId> 45 <artifactId>spring-boot-starter-test</artifactId> 46 <scope>test</scope> 47 </dependency> 48 <dependency> 49 <groupId>org.springframework.boot</groupId> 50 <artifactId>spring-boot-devtools</artifactId> 51 </dependency> 52 <dependency> 53 <groupId>org.apache.tomcat</groupId> 54 <artifactId>tomcat-dbcp</artifactId> 55 <version>${tomcat.version}</version> 56 </dependency> 57 </dependencies> 58 59 <build> 60 <plugins> 61 <plugin> 62 <groupId>org.springframework.boot</groupId> 63 <artifactId>spring-boot-maven-plugin</artifactId> 64 </plugin> 65 <plugin> 66 <groupId>org.mybatis.generator</groupId> 67 <artifactId>mybatis-generator-maven-plugin</artifactId> 68 <version>1.3.7</version> 69 </plugin> 70 </plugins> 71 </build> 72 73</project>
  • TestServerApplication.java

java

1@SpringBootApplication 2@EnableAutoConfiguration 3public class TestServerApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(TestServerApplication.class, args); 7 } 8 9 @Bean 10 public TomcatServletWebServerFactory tomcatFactory() { 11 return new TomcatServletWebServerFactory() { 12 @Override 13 protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) { 14 tomcat.enableNaming(); 15 return super.getTomcatWebServer(tomcat); 16 } 17 18 @Override 19 protected void postProcessContext(Context context) { 20 ContextResource resource = new ContextResource(); 21 resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); 22 resource.setName("jdbc/__TestDB"); 23 resource.setType(DataSource.class.getName()); 24 resource.setProperty("driverClassName", "org.postgresql.Driver"); 25 resource.setProperty("url", "jdbc:postgresql://***.***.***.***:****/TestDB"); 26 resource.setProperty("username", "********"); 27 resource.setProperty("password", "********"); 28 context.getNamingResources().addResource(resource); 29 } 30 }; 31 } 32 33 @Lazy 34 @Bean(destroyMethod = "") 35 public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { 36 JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 37 bean.setJndiName("java:comp/env/jdbc/__TestDB"); 38 bean.setProxyInterface(DataSource.class); 39 bean.setLookupOnStartup(false); 40 bean.afterPropertiesSet(); 41 return (DataSource) bean.getObject(); 42 } 43 44}
  • ApiController.java

java

1@RestController 2@RequestMapping("api") 3public class ApiController { 4 5 @Autowired 6 private TestTableMapper testTableMapper; 7 8 /** 9 * 文字列を返す 10 * 11 * @return 12 * @throws IOException 13 */ 14 @RequestMapping("hello") 15 private String hello(HttpServletRequest request, HttpServletResponse response) throws IOException { 16 17 TestTable testTable = testTableMapper.selectByPrimaryKey((long) 1); 18 19 LogUtils.info("api/helloエンドポイントにGetアクセスがありました。"); 20 21 return "SpringBoot \"API & DB Access\" Test. 名前=" + testTable.getName(); 22 } 23} 24
  • application.yml

yml

1spring: 2 datasource: 3 jndi-name: java:comp/env/jdbc/__TestDB

試したこと

下記サイト等を参考にいたしました。

下記記述をいろいろと変更してみたりしましたが解決しませんでした。

java

1resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); 2resource.setProperty("factory", "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"); 3resource.setProperty("factory", "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory");

補足情報(FW/ツールのバージョンなど)

  • IDE STS 4.2.1
  • PostgreSQL 10.7

不備等ありましたら修正いたしますので何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/13 13:44

組み込みTOMCATでJNDIのデータソースは使えませんよ。 JNDIの設定はアプリ間でDBの設定を共有するためのものですから BootJar では意味がないです。 無駄なコスト
fsk5303
退会済みユーザー

退会済みユーザー

2019/08/13 14:57 編集

多分、そっちで受け取った使えないのニュアンスが違うかと そっちで受け取ったのは実装できないと同じ意味で受け取ってるようだけど 使えないと実装できないは違うからね
fsk5303

2019/08/13 15:02

なるほど、理解いたしました。「そこまでして実現するほどの意味はないよ」ということでしたか。 開発と本番でJNDIのリソース名を統一しておくことで、ソースコードや設定ファイルの変更をしなくても両方の環境でそれぞれ異なるDBへ接続できるため有意義だと考えているのですが間違いでしたでしょうか。 そうだとしたら、どのように実現するのが有意義でしたでしょうか...。
退会済みユーザー

退会済みユーザー

2019/08/13 15:28

spring boot の場合以下の方式が一般的 ① アクティブプロファイルによる変更(②か③でプロファイルを設定) 参考:https://qiita.com/mas0061/items/4dd9c54a6bc69b564a02 ② 環境変数で設定 【注意事項】アクティブプロファイルの設定をするのに使う場合があるが、 こっちで全部を設定すると保守が大変 ③ 起動オプションによる設定 【注意事項】アクティブプロファイルの設定をするのに使う場合があるが、 こっちで全部を設定すると保守が大変 質問のやり方を否定してるので回答にはしません
fsk5303

2019/08/13 23:34

ご助言ありがとうございます。大変参考になります。こちらの手段も視野に入れて検討したいと思います。
guest

回答1

0

自己解決

PC,IDE共に起動しっぱなしで作業をしていたのですが、IDEを再起動したところエラーが解決いたしました。
お手数おかけいたしました。asahina1979さん、ありがとうございました。

投稿2019/08/14 02:20

fsk5303

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問