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

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

ただいまの
回答率

89.52%

SpringBoot エラー解決方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,667

jampack

score 4

前提・実現したいこと

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

エラーメッセージ

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room]


Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room]

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room]
追記4
    select
        meetingroo0_.room_id as room_id1_0_0_,
        meetingroo0_.room_name as room_nam2_0_0_ 
    from
        meeting_room meetingroo0_ 
    where
        meetingroo0_.room_id=?
2019-05-18 22:54:10.911 TRACE 5052 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [7]
2019-05-18 22:54:11.126 ERROR 5052 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "rooms/listRooms": Error resolving template [rooms/listRooms], template might not exist or might not be accessible by any of the configured Template Resolvers

org.thymeleaf.exceptions.TemplateInputException: Error resolving template [rooms/listRooms], template might not exist or might not be accessible by any of the configured Template Resolvers

2019-05-18 22:54:11.136 ERROR 5052 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [rooms/listRooms], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause

org.thymeleaf.exceptions.TemplateInputException: Error resolving template [rooms/listRooms], template might not exist or might not be accessible by any of the configured Template Resolvers

該当のソースコード

package mrs.domain.model;
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class MeetingRoom implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String roomId;


    private String roomName;
    public String getroomName() {
        return this.roomName;
    }
    public void setroomName(String roomName) {
        this.roomName=roomName;
    }
}
DROP TABLE IF EXISTS meeting_room CASCADE;
DROP TABLE IF EXISTS reservable_room CASCADE;
DROP TABLE IF EXISTS reservation CASCADE;
DROP TABLE IF EXISTS usr CASCADE;

CREATE TABLE IF NOT EXISTS meeting_room(
    room_id SERIAL NOT NULL,
    room_name VARCHAR(255) NOT NULL,
    PRIMARY KEY(room_id)
);
CREATE TABLE IF NOT EXISTS reservation(
    reservation_id SERIAL NOT NULL,
    end_time TIME NOT NULL,
    start_time TIME NOT NULL,
    reserved_date DATE NOT NULL,
    room_id INT4 NOT NULL,
    user_id VARCHAR(255) NOT NULL,
    PRIMARY KEY (reservation_id)
);
CREATE TABLE IF NOT EXISTS reservable_room(
    reserved_date DATE NOT NULL,
    room_id INT4 NOT NULL,
    PRIMARY KEY (reserved_date,room_id)
);
CREATE TABLE IF NOT EXISTS usr(
    user_id VARCHAR(255) NOT NULL,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL
    role_name VARCHAR(255) NOT NULL
    PRIMARY KEY (user_id)
);

ALTER TABLE reservable_room DROP CONSTRAINT IF EXISTS fk_A;
ALTER TABLE reservation DROP CONSTRAINT IF EXISTS fk_B;
ALTER TABLE reservation DROP CONSTRAINT IF EXISTS fk_C;
ALTER TABLE reservable_room ADD CONSTRAINT fk_A FOREIGN KEY (room_id) REFERENCES meeting_room;
ALTER TABLE reservation ADD CONSTRAINT fk_B FOREIGN KEY (reserved_date,room_id) REFERENCES reservable_room;
ALTER TABLE reservation ADD CONSTRAINT fk_C FOREIGN KEY (user_id) REFERENCES usr;
プロパティ
spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/mrs
spring.datasource.username=mrs
spring.datasource.password=mrs
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate,format_sql=true
spring.datasource.sql-script-encoding=UTF-8
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE言語を入力
追記3
Controllerクラス
package mrs.app.room;

import java.time.LocalDate;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import mrs.domain.model.ReservableRoom;
import mrs.domain.service.room.RoomService;

@Controller
@RequestMapping("rooms")
public class RoomsController {
    @Autowired
    RoomService roomService;

    @RequestMapping(method = RequestMethod.GET)
    String listRooms(Model model) {
        LocalDate today = LocalDate.now();
        List<ReservableRoom> rooms = roomService.findReservableRooms(today);
        model.addAttribute("date",today);
        model.addAttribute("rooms" , rooms);
        return "room/listRoom";
    }
    @RequestMapping(path = "{date}",method  =RequestMethod.GET)
    String listRooms(
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)@PathVariable("date")LocalDate date, Model model) {
        List<ReservableRoom>rooms = roomService.findReservableRooms(date);
        model.addAttribute("rooms",rooms);
        return "room/ListRooms";
    }
}
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 http://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.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>mrs</groupId>
    <artifactId>mrs</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mrs</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>

    </properties>

    <dependencies>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
            <version> 3.0.4.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</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>
            </plugin>
        </plugins>
    </build>
</project>

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jampack

    2019/05/18 15:41 編集

    SQL文は上記のコードどおりといいましたがよくみるとこちらのコードは空白が抜けていたようなので修正しました。
    だとあとコンバーターありだとWEBページも表示されずアプリケーションは終了します。エラー文は(コマンドプロンプトでテーブルを作っているにもかかわらず)missing tableです。また何の本のコードか明記していなかったのでかいておきますいておきます。




    Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発 Spring FrameworkによるJavaアプリケーション
    14章チュートリアル

    キャンセル

  • jampack

    2019/05/18 23:01

    テーブル作成後http://localhost:8080/roomsにアクセスしたあとにコンソールに重要そうなエラーメッセージが追加されていたので追記しました

    キャンセル

  • jampack

    2019/05/18 23:19

    大変申し訳ございません。前回挙げたWEBページは間違っていてただしくはこちらです。誤ってhttp://localhost:8080にアクセスしたものをあげてしまいました。
    Whitelabel Error Page
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    Sat May 18 23:15:06 JST 2019
    There was an unexpected error (type=Internal Server Error, status=500).
    Error resolving template [room/listRooms], template might not exist or might not be accessible by any of the configured Template Resolvers

    キャンセル

回答 1

checkベストアンサー

+2

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発 Spring FrameworkによるJavaアプリケーション
14章チュートリアル

この書籍で使用しているSpring Bootのバージョンは1.3です。それに対してご質問のプロジェクトはSpring Boot 2.1.4を使用されています。
書籍の通りにコードを書いても正常に動かないのはバージョンの違いが原因の1つだと思います。

ただ、以下の修正を行うことでアプリケーションを動かせるかもしれませんのでご確認ください。

application.properties

spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/mrs
spring.datasource.username=mrs
spring.datasource.password=mrs
spring.jpa.hibernate.ddl-auto=validate
# カンマが使われていたのでピリオドに修正
# spring.jpa.properties.hibernate,format_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.sql-script-encoding=UTF-8
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

# 追加
spring.datasource.initialization-mode=always
spring.jpa.open-in-view=true

追加したspring.datasource.initialization-modeは、以前のバージョン(Spring Boot 1.3)ではspring.datasource.initializeという名前で、デフォルト値はtrueでした。つまりschema.sqlとdata.sqlをクラスパス上に置いておけば、アプリケーション起動時に実行されるようになっていました。
しかしバージョンが上がって新しいプロパティspring.datasource.initialization-modeのデフォルト値はembeddedになり、埋め込みデータベース(H2など)でなければschema.sqlとdata.sqlは実行されないようになりました。
値をalwaysにすると利用するデータベースの種類に関係なくschema.sqlとdata.sqlを実行するようになります。

hibernate.properties
次にhibernate.propertiesというファイルをapplication.propertiesファイルと同じ場所に作成し、下記の行を記述してください。

hibernate.jdbc.lob.non_contextual_creation=true

MeetingRoom.java
roomIdの型はStringではなくIntegerです。
また、getter/setterが無いので追加してください。

@Entity
public class MeetingRoom implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer roomId;
  private String roomName;

  public Integer getRoomId() {
    return roomId;
  }
  public void setRoomId(Integer roomId) {
    this.roomId = roomId;
  }
  public String getRoomName() {
    return roomName;
  }
  public void setRoomName(String roomName) {
    this.roomName = roomName;
  }
}

RoomService.java

質問内容にはありませんが、Spring Boot 2.0よりRepositoryのメソッドも変わっているので修正が必要です。

public class RoomService {

  // 省略

  public MeetingRoom findMeetingRoom(Integer roomId) {
    // return meetingRoomRepository.findOne(roomId);
    // findOneメソッドはfindByIdに変わっています。
    // また戻り値の型がOptionalになっているので、orElseGetでMeetingRoomかnullを返すようにしています。
    return meetingRoomRepository.findById(roomId).orElseGet(null);
  }
}

何度か指摘させてもらいましたがカンマ抜けの構文ミスが残っているので改めてご指摘します。
質問内容に記載するコードやエラーメッセージは実際のものを記述してください。でないと不要な指摘が発生して時間を無駄にしてしまいます。

CREATE TABLE IF NOT EXISTS usr (
    user_id VARCHAR(255) NOT NULL,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL, /*カンマが抜けています*/
    role_name VARCHAR(255) NOT NULL, /*カンマが抜けています*/ 
    PRIMARY KEY (user_id)
);

以上の修正を行えばアプリケーションが起動すると思います。
http://localhost:8080/rooms/ にアクセスして画面が表示されることをご確認ください。
上手くいけば下図の画面が表示されると思います。(data.sqlの内容によってことなると思います)
イメージ説明

最低限のコードでの動作確認なので、また別の原因で動かない(エラーが起きる)ということも十分に考えられますが、参考にしている書籍のバージョンが1.3とだいぶ古いので適宜読み替えて理解していく必要があると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/19 01:15

    初期データを投入するsqlファイルの名前は deta.sql になっているのですか?
    であれば、data.sql に直してください。

    キャンセル

  • 2019/05/19 01:21

    ありがとうございます!!無事表示されました!あなたに出会えて本当に良かったです!

    キャンセル

  • 2019/05/19 01:35

    解決されたようで良かったです。ですがその書籍で学習を続けると別の新しい問題に悩まされるかもしれません。
    早いうちにSpring Boot 2.xを扱っている書籍に切り替えられることをお勧めします。

    キャンセル

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

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る