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

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

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

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

Spring Boot

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

Q&A

解決済

2回答

40799閲覧

Spring bootにおけるビルド失敗

sanezane

総合スコア91

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2018/11/23 07:43

編集2018/11/23 08:02

Spring boot 2.1.0にてWebアプリケーションを勉強中です。その中で、ビルドエラーが発生し対処が不明のためご意見を頂戴したいと思っております。

アプリケーション仕様:部屋予約サイト

//エラーログ Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2018-11-23 03:43:45.939 ERROR 23104 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Field roomService in com.example.demo.RoomsController required a bean of type 'domain.room.RoomService' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true)

RoomsControllerRoomServiceのBean定義がないと言われていると解釈していますがRoomsControllerには**@Autowired**アノテーションがついているのでBeanアノテーションは必要ないかと思っているですが、そもそもエラーの解釈が違い、違うアプローチが必要なのでしょうか?

RoomsController

1package com.example.demo; 2 3import java.time.LocalDate; 4import java.util.List; 5import domain.model.ReservableRoom; 6import domain.room.RoomService; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.format.annotation.DateTimeFormat; 9import org.springframework.stereotype.Controller; 10import org.springframework.ui.Model; 11import org.springframework.web.bind.annotation.PathVariable; 12import org.springframework.web.bind.annotation.RequestMapping; 13import org.springframework.web.bind.annotation.RequestMethod; 14 15@Controller 16@RequestMapping("rooms") 17public class RoomsController { 18 @Autowired 19 RoomService roomService; 20 21 @RequestMapping(value = "{date}", method = RequestMethod.GET) 22 String listRooms(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable("date") LocalDate date, Model model) { 23 List<ReservableRoom> rooms = roomService.findReservableRooms(date); 24 model.addAttribute("rooms", rooms); 25 return "room/listRooms"; 26 } 27 28 @RequestMapping(method = RequestMethod.GET) 29 String listRooms(Model model) { 30 LocalDate today = LocalDate.now(); 31 model.addAttribute("date", today); 32 return listRooms(today, model); 33 } 34}

RoomService

1package domain.room; 2 3import java.time.LocalDate; 4import java.util.List; 5import domain.model.ReservableRoom; 6import domain.repository.room.ReservableRoomRepository; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Service; 9import org.springframework.transaction.annotation.Transactional; 10 11@Service 12@Transactional 13public class RoomService { 14 @Autowired 15 ReservableRoomRepository reservableRoomRepository; 16 @Autowired 17 MeetingRoomRepository meetingRoomRepository; 18 19 public List<ReservableRoom> findReservableRooms(LocalDate date) { 20 return reservableRoomRepository.findByReservableRoomId_reservedDateOrderByReservableRoomId_roomIdAsc(date); 21 } 22 23// public MeetingRoom findMeetingRoom(Integer roomId) { 24// return meetingRoomRepository.findOne(roomId); 25// } 26}

教材サンプルソースコードはダウンロード可能なのですが公共の場にリンクを貼っていいのか判断がつきませんのでエラーに該当するクラスのみソースコードを貼っておきます。

追加情報:パッケージエクスプローラのキャプチャ追加
イメージ説明

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

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

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

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

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

rubytomato

2018/11/23 07:58

パッケージの定義(構造)に問題があるように思います。パッケージの構造がわかるような情報(たとえばパッケージとソースコードの一覧が確認できるプロジェクトエクスプローラーのスクリーンショットなど)があるといいと思います。
sanezane

2018/11/23 08:03

すみません!貼ろうと思って忘れていました。。見にくいと思ったのでフォルダ構成は該当ソースのフォルダしか開いていませんが確認できますでしょか。
rubytomato

2018/11/23 08:54

情報の追記ありがとうございます。回答致しましたのでご確認ください。
guest

回答2

0

ベストアンサー

現在のパッケージの構造をフォルダ風に表現すると以下のようになるとおもいます。
ご覧の通り、com.example.demodomainが別々の階層になっています。

text

1com/ 2 | 3 +--- example/ 4 | 5 +--- demo/ 6 | 7 +--- RoomsController.java 8 +--- SampleApplication.java 9 +--- TyhmeleafConfig.java 10 11domain/ 12 | 13 +--- model/ 14 | | 15 | +--- ReservableRoom.java 16 | 17 +--- repository/ 18 | | 19 | +--- room/ 20 | | 21 | +--- ReservableRoomRepository.java 22 | 23 +--- room/ 24 | 25 +--- MeetingRoomRepository.java 26 +--- RoomService.java

これを、以下のように(model、repository、roomパッケージをcom.example.demoパッケージ下に移動)統合し、

text

1com/ 2 | 3 +--- example/ 4 | 5 +--- demo/ 6 | 7 +--- RoomsController.java 8 +--- SampleApplication.java 9 +--- TyhmeleafConfig.java 10 | 11 +--- model/ 12 | | 13 | +--- ReservableRoom.java 14 | 15 +--- repository/ 16 | | 17 | +--- room/ 18 | | 19 | +--- ReservableRoomRepository.java 20 | 21 +--- room/ 22 | 23 +--- MeetingRoomRepository.java 24 +--- RoomService.java 25

移動したjavaソースのpackage宣言も修正すると解決すると考えています。
たとえば、RoomService.javaであれば

RoomService

1package domain.room; 2 3@Service 4@Transactional 5public class RoomService { 6}

から

RoomService

1package com.example.demo.room; 2 3@Service 4@Transactional 5public class RoomService { 6}

のようにです。

このようなパッケージ構造にするとなぜ解決するか(解決するかはまだわからいないですが)ですが、Spring Bootでは@SpringBootApplicationアノテーションが付いたクラスがある位置からパッケージスキャンが行われます。
パッケージスキャンを簡単に説明しますと、アプリケーションの起動時に@Controller@Service@Repository@Componentアノテーションが付いているクラスを探し出してインスタンス化し、Springの管理下に納めます。
そして、Springの管理下にあるインスタンスは@Autowiredアノテーションが付いたフィールドへ、必要なタイミングで代入(インジェクト)されるという風になっています。

今回のご質問されたプロジェクトでは、@SpringBootApplicationアノテーションが付いたクラスは、おそらくSampleApplicationクラスだと思いますが、パッケージスキャンはこのクラスの位置、つまりcom.example.demoから始まります。このため別の階層にあるdomainはスキャンの対象外になり、このパッケージ下の@Serviceアノテーションなどが付いたクラスは、Springの管理下にはなりません。

これがRoomServiceがAutowiredされない原因だと考えています。
この考え方に間違いがなければ、上記の内容で問題は解決できるとおもっているのですが、この方法で解決した場合、参考にされている教材とプロジェクトの内容に差が出てしまい、このさき困ることが出てくるかもしれません。

なので、いったん教材の方の@SpringBootApplicationアノテーションが付いているクラスやコントローラクラスがどのパッケージの位置にあるのかを確認して頂き、そちらの内容にあわせてcom.example.demoのパッケージ下のクラスを移動させることがいいかもしれません。

投稿2018/11/23 08:52

rubytomato

総合スコア1752

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

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

sanezane

2018/11/23 12:48

ありがとうございます。rubytomatoさんのおかげで勉強になっております。今回の質問でアノテーションの基本的な使い方と意味を勉強できました。今回のエラーは解決いたしました。
guest

0

SpringBootの @SpringBootApplication は、@Configuration@EnableAutoConfiguration@ComponentScan を内包します。

特に @ComponentScan はSpringFrameworkの管理下におくクラスをパッケージ名で指定しますが、これを指定しないときは、このアノテーションが存在するパッケージとサブパッケージを対象にします。これは @SpringBootApplicationでも同様です。

もしデフォルトの動作を変えたい場合は、スキャン対象のパッケージを全て記載します。

以上の詳細は、https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#using-boot-structuring-your-code とその前後の章や節を参考にされると良いでしょう。

投稿2018/11/23 09:49

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問