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

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

新規登録して質問してみよう
ただいま回答率
85.37%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

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

Spring

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

MyBatis

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

Spring Boot

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

Q&A

1回答

4173閲覧

DIコンテナからBeanを取得したい

nagasaka

総合スコア0

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

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

Spring

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

MyBatis

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

Spring Boot

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

0グッド

0クリップ

投稿2021/11/29 03:43

編集2021/11/30 11:47

前提・実現したいこと

Spring Boot を使用したCRUD機能を持ったWebアプリを制作しています。
現在は会員登録機能を実装している段階です。
DIコンテナからMapper.java のBeanを変数に注入しようとしましたら以下のエラーが
表示されました。

Field user in com.example.demo.controller.RegisterController required a bean of type 'com.example.demo.repository_interface.UserMapper' that could not be found.

他の質問でエラー解消の方法を尋ねた際に、@Import アノテーションをMapperクラスに
付けるようにとご指摘を頂きましたので試してみたところエラーは消えましたが
別の例外が出力されてしまいました。
半日試行錯誤しましたが解決する事は出来ませんでした。
解決方法をご教示頂きたいです。宜しくお願い致します。

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

DIコンテナからBeanを取得する事が出来ません。原因はUserMapper.javaをDIコンテナにBeanとして格納する事が出来ていないからだと考えています。根本的な原因はUserMapper.javaとUserMapper.xmlが何かしらの原因で関連付けされていない或いは機能していないからではないかと考えています。

エラーメッセージ org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'registerController': Unsatisfied dependency expressed through field 'user'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.demo.repository_interface.UserMapper': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.demo.repository_interface.UserMapper]: Specified class is an interface 以下略 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.demo.repository_interface.UserMapper': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.demo.repository_interface.UserMapper]: Specified class is an interface 下略

該当のソースコード

【pom.xml】

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.application</groupId> <artifactId>spring_application</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>spring_application</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> ↓ MyBatis読み込み場所 <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>

【UserMapper.java】

package com.example.demo.repository_interface; import org.apache.ibatis.annotations.Mapper; import com.example.demo.object.User; @Mapper public interface UserMapper { public void Register(User user); }

【UserMapper.xml】

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.repository_interface.UserMapper"> <insert id="Register" parameterType="User"> insert into user( name ,password ) values( #{name} ,#{password} ) </insert> </mapper>

【RegisterController】

package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import com.example.demo.object.User; import com.example.demo.repository_interface.UserMapper; @Controller public class RegisterController { @Autowired UserMapper user_mapper; ←この部分  @GetMapping("/Register") public String getRegister(@ModelAttribute User user) { return "Register"; } }

【Application.java】

package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages={"com.example.demo"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

試したこと

・Mybatisに必要なライブラリが欠けている可能性を疑いました。
・pom.xml にmybatis-spring-boot-starter が存在するか確認しました。

・DIコンテナにMapperが登録されていない可能性を疑いました。
・Mapper.javaに@Mapperがついているかどうかを確認しました。
・Mapper.xmlのnamespace属性やID属性の情報が間違っていないかを確認しました。

・コンポーネントスキャンの対象になっていない可能性を疑いました。
・Application.javaに@SpringBootApplication(scanBasePackages={"com.example.demo"})を追記しました。

ファイル構成は以下の通りです。
![イメージ説明]

ご指導をお願い致します。

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

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

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

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

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

kiino

2021/12/02 16:13

com.example.demo.object.User クラスの定義と application.properties の内容についても教えてもらうことはできないでしょうか
guest

回答1

0

クラス名冒頭に@Importアノテーションで対象クラスを読み込むように記載してみてください。

今回だとこんな感じかな

java

1 2@Import({ 3UserMapper.class 4}) 5public class RegisterController { 6 @Autowired UserMapper user_mapper;

※1つだけなら{}は不要です

投稿2021/11/29 04:41

m.ts10806

総合スコア80875

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

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

nagasaka

2021/11/29 07:12

ご回答ありがとうございます。 ご指摘して頂いた点を修正した所、別の例外が表示されてしまいました。 差し支えなければご指導いただければと思っております。 追加で表示された例外情報や個人的な見解を追記させて頂きましたので、ご意見を頂ければと思っております。宜しくお願い致します。
m.ts10806

2021/11/29 07:48

あぁそういえばUserMapperってinterfaceでしたか。 Autowiredはオブジェクトを注入してくれる役割を持ちます。 インスタンスを入れてくれるんです。 interfaceはインスタンス化できないので、当該interfaceを実装したクラスを用意してそちらをAutowiredすることになるのではと。
nagasaka

2021/11/29 10:42

やはりそうですよね。ちなみに私は、 Mapper.javaとMapper.xmlを@Mapper や namespace 属性で関連付けする事で、 Interfaceクラスを実装する事が出来て、DIする事もできる と考えていたのですがこの認識は間違えなのでしょうか。
m.ts10806

2021/11/30 11:14

>と考えていたのですが 結局はSpringの仕様なので事実確認は個人の想像ではなくドキュメント・機能リファレンスで行ってください。
nagasaka

2021/11/30 11:43 編集

投稿物に関しては削除依頼をさせて頂きました。 失礼しました。 確かに調べればわかる事を尋ねる必要はないですし、信頼性の高いリソースを参考にするべきですね。 安直な方法に手を出し、不快にさせてしまい申し訳ありませんでした。 技術書で内容を確認しました。@Mapperやnamespace属性を設定する事で BeanをDIコンテナに登録できるようです。 何故登録できているはずのものが出来ていないのかがやはりわかりませんが、 自分で調べて解決したいと思います。 ご指摘ありがとうございました。
m.ts10806

2021/11/30 11:49

結局は書いた通りにしか動かないので、動くには動く理由があるし動かないには動かない理由があります。そのあたりを念頭におけば自身で解決できることも増えると思います(書籍が悪いとは言いませんが、必ず公式ドキュメントで裏取りしてください。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問