Spring Bootの環境構築から簡易アプリの作成

皆さんこんにちは。どうも。

今回は、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)の詳細や書き方は、以下の記事を参考にすると良いです。

※参考1 ※参考2 ※参考3

アプリケーション実行時のエラー

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 {
….}

※参考1 ※参考2

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>

この後、ハンズオン通りにアプリをサクサク作っていきました。

実行結果は以下のようになりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA