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

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

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

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

Spring Boot

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

Q&A

解決済

1回答

4943閲覧

Spring bootにおけるビルド失敗2

sanezane

総合スコア91

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2018/11/23 12:45

編集2018/11/24 17:09

お世話になっております。Spring bootにおけるビルド失敗のもう1つのエラーについて質問させていただきます。
前回と同じステージで止まっており一部のユーザーの方に大変お世話になっております。
よろしければ、この問題についてもご意見を頂戴したく質問致します。

エラー内容

Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'reservationUserDetailsService': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract mrs.domain.model.User mrs.domain.repository.user.UserRepository.findOne(java.lang.String)! No property findOne found for type User!

エラーログより、
Failed to create query for method public abstract mrs.domain.model.User mrs.domain.repository.user.UserRepository.findOne(java.lang.String)! No property findOne found for type User!
とあるため、UserRepositoryクラスのfindOneメソッドの引数がうまく渡っていない?と漠然と認識しています。
それがわかったところで以降のアプローチがわかりません。

・findOneメソッドを定義しているUserRepositoryを修正?
・引数がうまく渡っていないためUserモデルを修正?

UserRepository

1package mrs.domain.repository.user; 2 3import org.springframework.data.jpa.repository.JpaRepository; 4import mrs.domain.model.User; 5 6public interface UserRepository extends JpaRepository<User, String> { 7 8 User findOne(String username); 9}

User

1package mrs.domain.model; 2 3import javax.persistence.*; 4 5@Entity 6@Table(name = "usr") 7public class User { 8 @Id 9 private String userId; 10 private String password; 11 private String firstName; 12 private String lastName; 13 @Enumerated(EnumType.STRING) 14 private RoleName roleName; 15 16 public String getUserId() { 17 return userId; 18 } 19 20 public void setUserId(String userId) { 21 this.userId = userId; 22 } 23 24 public String getPassword() { 25 return password; 26 } 27 28 public void setPassword(String password) { 29 this.password = password; 30 } 31 32 public String getFirstName() { 33 return firstName; 34 } 35 36 public void setFirstName(String firstName) { 37 this.firstName = firstName; 38 } 39 40 public String getLastName() { 41 return lastName; 42 } 43 44 public void setLastName(String lastName) { 45 this.lastName = lastName; 46 } 47 48 public RoleName getRoleName() { 49 return roleName; 50 } 51 52 public void setRoleName(RoleName roleName) { 53 this.roleName = roleName; 54 } 55 56}

ReservationUserDetailsService

1package mrs.domain.service.user; 2 3import mrs.domain.model.User; 4import mrs.domain.repository.user.UserRepository; 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.security.core.userdetails.UserDetails; 7import org.springframework.security.core.userdetails.UserDetailsService; 8import org.springframework.security.core.userdetails.UsernameNotFoundException; 9import org.springframework.stereotype.Service; 10 11@Service 12public class ReservationUserDetailsService implements UserDetailsService { 13 @Autowired 14 UserRepository userRepository; 15 16 @Override 17 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 18 User user = userRepository.findOne(username); 19 if (user == null) { 20 throw new UsernameNotFoundException(username + " is not found."); 21 } 22 return new ReservationUserDetails(user); 23 } 24} 25

宜しくお願い致します。

■追加情報
テーブル一覧キャプチャ追加
イメージ説明

11月25日
githubリンク

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

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

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

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

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

tkmtmkt

2018/11/24 04:43

@Table(name = "usr")のusrは正しいの?
sanezane

2018/11/24 05:18

はい正しいです。紛らわしい命名ですみません。テーブル一覧のキャプチャ追加しました。
退会済みユーザー

退会済みユーザー

2018/11/24 10:19

findOne てすると WHERE ONE = ? になるような
sanezane

2018/11/24 14:25

findOneを使うこと自体が間違っているということでしょうか?ご意見が噛み砕けず申し訳ございません。
退会済みユーザー

退会済みユーザー

2018/11/24 16:07

ようみたらアノテーションしてないなリポジトリ
sanezane

2018/11/24 17:06

@Repositoryアノテーションを追加してみたのですがエラー内容は変わらずでした。。。初めてeclipseからgithubへプロジェクトを公開してみたのでもしよろしければ確認をお願い致します。。。本当に勉強になります。ありがとうございます。
guest

回答1

0

ベストアンサー

Spring使ったことないけどちょっと調べてみました。

  • メソッド名からクエリを生成するので、Repositoryのインタフェース定義にメソッドの定義はいらないようです。
  • 独自実装のクエリを使用する場合は「UserRepositoryCustomインタフェース+UserRepositoryImplクラス」の組み合わせで作成するようです。
  • Repositoryのインタフェース定義のメソッドを削除したら、以下のコンパイルエラーが出るようになりました。
.../Mrs/Mrs/src/main/java/mrs/domain/service/user/ReservationUserDetailsService.java:18: エラー: インタフェース QueryByExampleExecutor<T> メソッド findOneは指定された型に適用できません。 User user = userRepository.findOne(username); ^ 期待値: Example<S> 検出値: String 理由: 型変数Sを推論できません (引数の不一致: StringをExample<S>に変換できません:) S,Tが型変数の場合: メソッド <S>findOne(Example<S>)で宣言されているSはUserを拡張します インタフェース QueryByExampleExecutorで宣言されているTはObjectを拡張します

上記サンプルコードに合わせて以下のように修正すると、実行時エラーは出なくなります。(他二つのRepositoryについても同様に修正する必要あり)

java:src/main/java/mrs/domain/service/user/ReservationUserDetailsService.java

1package mrs.domain.service.user; 2 3import mrs.domain.model.User; 4import mrs.domain.repository.user.UserRepository; 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.data.domain.Example; 7import org.springframework.security.core.userdetails.UserDetails; 8import org.springframework.security.core.userdetails.UserDetailsService; 9import org.springframework.security.core.userdetails.UsernameNotFoundException; 10import org.springframework.stereotype.Service; 11 12@Service 13public class ReservationUserDetailsService implements UserDetailsService { 14 @Autowired 15 UserRepository userRepository; 16 17 @Override 18 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 19 // 検索条件をエンティティにセット 20 User probe = new User(); 21 probe.setUserId(username); 22 23 // 検索条件からExampleインスタンスを生成 24 Example<User> example = Example.of(probe); 25 User user = userRepository.findOne(example).get(); 26 27 if (user == null) { 28 throw new UsernameNotFoundException(username + " is not found."); 29 } 30 return new ReservationUserDetails(user); 31 } 32}

キー指定してエンティティを取得するのであれば、以下の記述でよいのではないかと思います。

java

1 User user = userRepository.findById(username).get();

【補足】

質問のタイトルが「ビルド失敗」となっていますが、ビルドは成功して実行時のDIで失敗しています。

投稿2018/11/25 03:03

編集2018/11/25 03:06
tkmtmkt

総合スコア1800

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

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

sanezane

2018/11/25 06:41

解決の手順まで丁寧に書いて下さりありがとうございます。 大変勉強になりました。 User user = userRepository.findById(username).get();へ修正したところうまく動いてくれました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問