皆さんこんにちは。どうも。
今回は、Spring Bootの環境構築から簡易アプリの作成ということについてです。
何故こんなことをやろうかと思ったのか?ですが、私は、仕事でSpringやMybatisを用いて、Webアプリの製造とか単体テスト(バック側)をバリバリやっていたことがあるのですが、いざ自分でSpring Bootのアプリを環境構築から作成したことはあまりないです。なので、今回は、Spring Bootのアプリを環境構築から作成してみました。
やった内容は以下になります。このサイトは第7回のハンズオン形式になっており、すごい学習しやすいです(Webアプリケーションの学習に最適)。
【図解付き!】Eclipseを使ってSpring Bootの開発環境を構築する【Spring Boot ハンズオン第1回】
ということで、今回は、私が躓いた点や、その対応等を主に話していきます。
Spring Bootのプロジェクト作成時のビルドツールとして、MavenとGradleが選べますが、どちらでもいいと思います。
私は、初めにGradleでプロジェクト作成して(正確には、Gradleで作成されていたサンプルプロジェクトに、今回のハンズオンの内容を追加していった)、結局htmlが上手く読み込めず、失敗して、次に、Mavenでプロジェクトを作成し直して、上手くできた感じです。
ということで、Gradleで作成したプロジェクトでの躓いた点から説明していきます。
エラー内容
ライブラリが見つからないというエラー
リポジトリインターフェース内で、
org.springframework.data.jpa.repository.JpaRepository
を使いたかったが、
org.springframework.data
が見つからないというエラーが発生
解決策
build.gradleに以下のように、org.springframework.dataの依存ライブラリを追記
(プロジェクト作成時にSpring Data JPAの依存関係を追加していなかったのが原因)。
ライブラリについての詳細や、最新バージョンは、org.springframework.dataとか(ライブラリ名)でググれば出てくる。
implementation group: ‘org.springframework.data’, name: ‘spring-data-jpa’, version: ‘3.4.1’
(implementation ‘org.springframework.data:spring-data-jpa:3.4.1’ )
モデル内で、javax.persistenceを使おうとした時も、同様のエラーが発生した(javax.persistenceが見つからない)。
この時も、上記と同じように、依存関係にjavax.persistenceの依存ライブラリを追記して解決した。
ちなみに、
Oracleとの合意に基づき、Eclipse Foundationはjavaxパッケージを変更できないため、Jakarta EE 9以降、名前空間がjavaxからjakartaに変更されました。
パッケージ名が変わっただけで、技術そのものは基本的にJava EEからJakarta EEに引き継がれています。
ただし、Jakarta EE 9以降は新機能や改善が追加され、よりオープンでコミュニティ主導のプロジェクトとなっています。
今後のエンタープライズ技術の標準はJakarta EEに移行していくため、新しいプロジェクトではjakartaパッケージを採用することが推奨されます。
とあるので、javax.persistenceではなく、jakarta.persistenceを使った方がいいかもしれません。
build.gradle内の依存関係(dependencies)の詳細や書き方は、以下の記事を参考にすると良いです。
アプリケーション実行時のエラー
Description:
Field repository in com.example.demo.service.BookService required a bean of type ‘com.example.demo.repository.BookRepository’ that could not be found.
The injection point has the following annotations:
– @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type ‘com.example.demo.repository.BookRepository’ in your configuration.
原因
BookRepositoryがSpringコンテナに登録されていないことが原因です。
@AutowiredはSpringコンテナに入っているBookRepositoryインターフェースを呼び出します。
SpringコンテナにはBookRepositoryインターフェースが登録されていませんでした。
そのため@AutowiredでBookRepositoryを呼ぶことができずエラーが発生しました。
BookRepositoryに@Repositoryを付けましたが、解消されなかったです。
解決策
アプリケーションの開始クラスに、
以下のように@ComponentScanを追記(なぜこれで解消されたのか?)。
BookRepositoryがSpringのコンテナに登録されたんだろうけど、
なぜわざわざこうしないと登録されないのか?BookRepositoryに@Repositoryを付けただけではダメなのか?そもそも@Repositoryを付けないととダメなのか?という疑問があります。
@SpringBootApplication
@ComponentScan(value = “com.example.demo.repository.BookRepository”)
public class DemoApplication {
….}
htmlファイルが見つからないというエラー(未解決)
以下のエラーが解消できない・・・
src/main/resources/templates
にhtmlファイルを置いてるのに見つからない
というエラー
(そもそもコントローラーに処理が来ていない)
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Thu Jan 09 20:16:56 JST 2025
There was an unexpected error (type=Not Found, status=404).
No static resource book-list.
org.springframework.web.servlet.resource.NoResourceFoundException: No static resource book-list.
at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
…
次に、Mavenでプロジェクトを作成し直したのですが、ここで躓いた点を説明していきます(結局、アプリは作成できた)。
今回は、前回のような、BookRepositoryがSpringコンテナに登録されていないというエラーは起きませんでした。
アプリケーション実行時のエラー
APPLICATION FAILED TO START
Description:
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
のようなエラーが発生。
解決策
簡単に言えばデータベースのエラー
pom.xmlに使いたいデータベース(ここではpostgresSQL)の依存関係を追記したら解決した。
(application.propertiesにもデータベースの情報を記載する必要がある)
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
この後、ハンズオン通りにアプリをサクサク作っていきました。
実行結果は以下のようになりました。



