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

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

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

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

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

Q&A

解決済

1回答

444閲覧

Mysql環境をdockerで作成しアプリケーションと連携したい(spring boot)

sanezane

総合スコア91

Java

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

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

0グッド

0クリップ

投稿2019/01/29 15:43

編集2019/02/02 09:09

□環境情報□
macOS:10.14.2
spring boot:2.1
Docker:version 18.09.1
mysql:8.0

やりたいこと

dockerにて構築したmysql環境から値を取得し画面に表示する
※docker環境の中のmysqlの今回の対象のテーブル情報を以下に載せます
イメージ説明

現状

findAll()メソッドにて値が取得できない

ソース情報

データベース名:demo
テーブル名:Account
カラム:id,email,password

以下デバッグ画像のfindAll()にてカラムid,email,passwordが取りたいのに、、、sizeが0で返ってくる。
イメージ説明

その他ソース

githubリンク
※findAll()はこちら側で別個定義が必要なのでしょうか?
それともDBと連携ができていない?
ご意見を宜しくお願いいたします。

applicationproperties

1spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false 2spring.datasource.username=root 3spring.datasource.password=p@ssw0rd 4spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 5spring.jpa.database=MYSQL 6spring.jpa.hibernate.ddl-auto=update

Entity

1package com.example.demo; 2 3import lombok.Data; 4 5import javax.persistence.Column; 6import javax.persistence.Entity; 7import javax.persistence.Id; 8import javax.persistence.Table; 9 10@Entity 11@Table(name = "Account") 12@Data 13public class AccountEntiry { 14 15 @Column 16 @Id 17 private int id; 18 19 @Column 20 private String email; 21 22 @Column 23 private String password; 24 25} 26

Repository

1package com.example.demo; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4import org.springframework.stereotype.Repository; 5 6@Repository 7public interface AccountRepository extends JpaRepository<AccountEntity,Integer> { 8} 9

Service

1package com.example.demo; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Service; 5 6@Service 7public class AccountService { 8 @Autowired 9 AccountRepository accountRepository; 10 11 12} 13

Controller

1package com.example.demo; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.stereotype.Controller; 5import org.springframework.ui.Model; 6import org.springframework.web.bind.annotation.RequestMapping; 7import org.springframework.web.bind.annotation.RequestMethod; 8 9import java.util.Collection; 10import java.util.Iterator; 11import java.util.List; 12import java.util.ListIterator; 13 14@Controller 15@RequestMapping("/") 16public class IndexController { 17 @Autowired 18 AccountRepository accountRepository; 19 20 @RequestMapping(value = "/", method = RequestMethod.GET) 21 public String index(Model model) { 22 List<AccountEntiry> emplist=accountRepository.findAll(); 23 model.addAttribute("emplist", emplist); 24 25 model.addAttribute("message", "Hello Springboot"); 26 return "index"; 27 28 } 29} 30

■修正情報■

■1/31■成果振り返り

まず、JpaRepository<Account,String>としていたものをidの属性であるJpaRepository<Account,Integer>へ変更。

デバッグ実行後、事象変わらず、、、SimpleJpaRepositoryを掘っていたら以下のエラーが出ていることが判明。

Error

1Method threw 'java.lang.IllegalStateException' exception. Cannot evaluate com.sun.proxy.$Proxy84.toString()

イメージ説明
今日はここまで。眠って、明日の業務後にデバッグします!

■2/1■成果振り返り

空いていたWindowsPCでローカル環境に直接MySql環境を構築し同じプロジェクトをgithubより落としてきて実行した。
→データベース連携成功...
dockerと何が違うのか...
以下Windowsでのデバッグ時画面とMacでの同じ場所での画像比較
■Windows
Windows画面
■Mac
イメージ説明

Macでは以下のエラーが出ている。

((SimpleJpaRepository)((SingletonTargetSource)((ProxyFactory)((JdkDynamicAopProxy)this.h).advised).t = No such instance field: 'h'

■2/2■成果振り返り

前回まででMysqlをローカルで環境構築してアプリケーションの動作がどうなるかを検証しました。
Windowsにて検証を行ったのですが同じソース、同じデータベース構造でデータベースの内容を画面へ表示することができました。
dockerとローカルで何が違うのか...

~~### 現在詰まっている箇所
イメージ説明
ローカルで実行した際には出ないエラーの調査をしています。

((SimpleJpaRepository)((SingletonTargetSource)((ProxyFactory)((JdkDynamicAopProxy)this.h).advised).t = No such instance field: 'h'

hフィールドを探す

hどこやねん

/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/lib/src.zip!/java.base/java/lang/reflect/Proxy.java

上記パス中にいました。
Proxy.javaてなんだ?
イメージ説明

hフィールドのエラー関係ない!!!!!!!

・macのローカル環境あんまり汚したくなかったけど仕方なくローカルにMysql環境構築しデータベース連携できるか確認
→連携成功。。。やはりdockerの設定に問題がある模様。
そして散々調べていたhフィールドですが、これはmac環境固有のもの?らしく、こちらが発生していてもデータベースとの連携は下図のように成功していました。。。

2月2日現状...どのように切り分けするべきかわからなくなっております。。。。ご意見をください。よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/29 23:47

データが登録されてないだけ
sanezane

2019/01/30 03:13

asahima1979さん ありがとうございます。しかし、最上部の画像(画像下部)にある通り1レコードだけですが、登録は確認しています。
退会済みユーザー

退会済みユーザー

2019/01/30 03:37 編集

見てる場所が違うきがしないでもないが
sanezane

2019/01/30 05:02

リポジトリが生成されているので接続自体は成功してると認識してますが、、そこからのアプローチをどうしようか考えております。 帰ったらまたデバッグしてみます!
guest

回答1

0

ベストアンサー

下記のファイルを修正することで正常に動作させることができると思います。
また、回答に記載したコードは質問文に書かれていたGitHubのリポジトリから転用させて頂きました。

V1_Account_create.sql

おそらく、今回の問題の一番の原因がこのsqlファイルだと思います。
プラットフォームによって大文字と小文字を区別するかどうか変わりますので、テーブル名は小文字で揃えておいた方がいいと思います。
詳しくは9.2.2 識別子の大文字と小文字の区別をご確認ください。

変更前

sql

1CREATE TABLE IF NOT EXISTS Account( 2 id int auto_increment COMMENT 'ユーザID', 3 email VARCHAR(255) NOT NULL COMMENT 'メールアドレス', 4 password VARCHAR(255) NOT NULL COMMENT 'パスワード', 5 unique index (id) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 7 8Insert into Account(email, password) values(‘xxxx’,’xxxx’);

変更後

  • テーブル名を小文字にしました。
  • プライマリキーを定義しました。JPAではプライマリキーは必要です。
  • insert文のvaluesで指定されている文字列をシングルクォートで囲むように修正しました。(変更前はシングルクォートではない文字が使われていたので実行時にエラーになります。)

sql

1CREATE TABLE IF NOT EXISTS account( 2 id int auto_increment COMMENT 'ユーザID', 3 email VARCHAR(255) NOT NULL COMMENT 'メールアドレス', 4 password VARCHAR(255) NOT NULL COMMENT 'パスワード', 5 primary key (id) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 7 8insert into account(email, password) values ('xxxx', 'xxxx');

AccountEntity.java

変更前

java

1@Entity 2@Table(name = "Account") 3@Data 4public class AccountEntity { 5 6 @Column 7 @Id 8 @GeneratedValue(strategy = GenerationType.IDENTITY) 9 private Integer id; 10 11 @Column 12 private String email; 13 14 @Column 15 private String password; 16 17 18}

変更後

  • テーブル名を小文字にしました。
  • Idカラムに対してColumnアノテーションは不要です。(付いていてもエラーにはなりません)

java

1@Entity 2@Table(name = "account") 3@Data 4public class AccountEntity { 5 6 @Id 7 @GeneratedValue(strategy = GenerationType.IDENTITY) 8 private Integer id; 9 10 @Column 11 private String email; 12 13 @Column 14 private String password; 15 16}

application.properties

問題はありませんが気になった点があったので、参考までに記載させて頂きます。(こう書かないといけないということではありません)

変更前

properties

1spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=UTF-8&serverTimezone=JST 2spring.datasource.username=root 3spring.datasource.password=p@ssw0rd 4spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 5spring.jpa.database=MYSQL 6spring.jpa.hibernate.ddl-auto=update

変更後

  • spring.datasource.driver-class-nameとspring.jpa.databaseを削除しました。このプロパティは基本的にSpring Bootの自動設定に任せてた方がいいとおもいます。

properties

1spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=UTF-8&serverTimezone=JST 2spring.datasource.username=root 3spring.datasource.password=p@ssw0rd 4spring.jpa.hibernate.ddl-auto=update

build.gradle

問題はありませんが気になった点があったので、参考までに記載させて頂きます。(書き方は統一しておいた方がいいと思いました。)
こちらの記事Gradle の compile, api, implementation とかについてで解説されているので気になったら読んでみてください。

変更前

dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // mysql database //compile "mysql:mysql-connector-java" //compile "org.flywaydb:flyway-core" //compile "org.springframework.boot:spring-boot-starter-security" compile('org.springframework.boot:spring-boot-starter-data-jpa') //compile('mysql:mysql-connector-java') runtime('mysql:mysql-connector-java') }

変更後

  • 依存関係の指定で新しい書き方と古い書き方が混在していたので新しい書き方へ統一しました。
dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java' runtimeOnly 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }

問題の切り分け

どこに問題があるのか切り分けを行ううえで、dockerのMySQLにログインしてデータベースの状態を確認することも有効です。
次のコマンドでMySQLにログインできます。

docker-compose exec mysql mysql -u root -pp@ssw0rd
mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.14 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | demo | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use demo Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------+ | Tables_in_demo | +----------------+ | account | +----------------+ 1 row in set (0.00 sec) mysql> select * from account; +----+-------+----------+ | id | email | password | +----+-------+----------+ | 1 | xxxx | xxxx | +----+-------+----------+ 1 row in set (0.00 sec)

もし上手くいかなかったら、dockerのコンテナを作り直すところからやり直してみてください。
そのとき、ローカル上に保存しているMySQLのデータ領域も削除したほうがいいかもしれませんが、消したくないデータもあるかと思いますので、ご自身の判断で行ってください。

投稿2019/02/02 13:15

rubytomato

総合スコア1752

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

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

sanezane

2019/02/02 15:33

ありがとうございます。無事、dockerで作成したmysql環境で連携確認ができました。 sqlファイルのテーブル定義とinsertが間違っており、内部でエラーが出ていたことが主因と認識しました。他にもbuild.gradleの書き方やapplication.propertiesの書き方も勉強になりました。 今のうちにどこかの記事にアウトプットしたいと思います。 2週間悩んでいたので大変勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問