前提・実現したいこと
発生している問題・エラーメッセージ
エラーメッセージ 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=? [2m2019-05-18 22:54:10.911[0;39m [32mTRACE[0;39m [35m5052[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.h.type.descriptor.sql.BasicBinder [0;39m [2m:[0;39m binding parameter [1] as [INTEGER] - [7] [2m2019-05-18 22:54:11.126[0;39m [31mERROR[0;39m [35m5052[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36morg.thymeleaf.TemplateEngine [0;39m [2m:[0;39m [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 [2m2019-05-18 22:54:11.136[0;39m [31mERROR[0;39m [35m5052[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
エラーもコードブロックにいれてください
アクセサ問題のきがするけど様子見をしよう
そういえば1年以上前に同じコードの質問をみたきがするな・・・・
その方もおんなじ本を使っているのでしょうか、一応私はコマンドプロンプトからデータベースに接続したのですがそもそもテーブルが作られていませんでした。上のコードはeclipseで書いているのですがそもそもテーブルが作られていない原因はなんだと考えられますか?もうかれこれ3日くらいここでとまっているので些細なことでもいいので教えてください
質問内容に提示されているDDL(SQL)のCREATE TABLE文の構文が間違っているとおもいます。CREATE TABLE IF NOT EXISTS meeting_room { ...省略... }; と書かれていますが、正確にはCREATE TABLE IF NOT EXISTS meeting_room ( ...省略... );ではないでしょうか?
確かに!と思って修正しました。これで解決できればよかったのですがまた新たなエラーに直面してしまいました。
usrテーブルを作成するDDLにはまだ構文ミスがあります。一度PostgreSQLにログインしてすべてのSQL文が正しく実行できるか確認してください。
SQL文が正しくなってもまだ同じエラーが起きる場合は、コントローラかアプリケーションへのアクセスに問題があるかもしれませんので、それらの情報を質問内容に追記ください。
追記3 本通りに書いていたといいましたが省略したクラスがありました。Converterクラスです。省略した理由ですがJPA2.2の新機能としてJava 8の日付と時間のサポートに java.time.LocalDate java.time.LocalTime java.time.LocalDateTime が含まれているのでコンバータのコーディングは必要なくなるとのことでしたので書きませんでした。ところが実際書いてみるとアプリケーションが終了し以下のような異なるエラーが出るようになりました。文字数の関係でatは省略します
SQL文を入力しましたが問題なくテーブル作成、データの挿入はできました
テーブル作成後アプリケーションを実行しても同じエラーでした。
コンバーターあり→アプリケーション終了
なし→WEB上でエラー
なぜかはわかりませんが、プロパティファイルのデータベースをpostgresにするとmissing table meeting_room
mrsにするとWEBページ上でエラーになります
どうやらmrsで直接作ったテーブルが消えてなかったみたいです。すべて元に戻りました。missing tableです。
> SQL文を入力しましたが問題なくテーブル作成、データの挿入はできました
質問内容の CREATE TABLE IF NOT EXISTS usr( ... ); 文にはまだ構文エラーがありますが、本当にこのDDLを実行してテーブルが作成できたのでしょうか?
お手元の実行したSQL文と質問内容に違いがあるのであれば質問内容の訂正をお願いします。
また、テーブルがある状態ではページ表示時にエラーになるというですが、このときのエラーの詳細も追記してください。
CREATE TABLEと表記され念のため¥d(テーブル一覧のコマンド)で確かめましたがテーブルusrは作成されていました。色々状況がごちゃごちゃになってしまったので現在の状況をまとめます。
最初のエラーと同じくmissing tableでテーブル自体が作成できずアプリケーションも終了するためページを検索しても出てこない。
前にwebページが表示されたのは私がコマンドプロンプトで直接うったテーブルの消し忘れで多分その影響かと思います
SQL文は上記のコードどおりです。すべてのテーブルをコマンドプロンプトで作成したあとのWEBページでのエラー文は
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat May 18 15:27:52 JST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
eclipse上では
java.lang.reflect.InvocationTargetException: null
at...省略
Caused by: java.sql.SQLFeatureNotSupportedException: org.postgresql.jdbc.PgConnection.createClob() メソッドはまだ実装されていません。
at org.postgresql.Driver.notImplemented(Driver.java:688) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1269) ~[postgresql-42.2.5.jar:42.2.5]
... 44 common frames omitted
[2m2019-05-18 15:33:55.119[0;39m [32m INFO[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36morg.hibernate.type.BasicTypeRegistry [0;39m [2m:[0;39m HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@74ea46e2
[2m2019-05-18 15:33:55.715[0;39m [32m INFO[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36mj.LocalContainerEntityManagerFactoryBean[0;39m [2m:[0;39m Initialized JPA
EntityManagerFactory for persistence unit 'default'
もう追記では書ききれないようなのでここにかきます
[2m2019-05-18 15:33:56.131[0;39m [32m INFO[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.s.s.concurrent.ThreadPoolTaskExecutor [0;39m [2m:[0;39m Initializing ExecutorService 'applicationTaskExecutor'
[2m2019-05-18 15:33:56.158[0;39m [33m WARN[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36maWebConfiguration$JpaWebMvcConfiguration[0;39m [2m:[0;39m spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
[2m2019-05-18 15:33:56.307[0;39m [32m INFO[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36mo.s.b.w.embedded.tomcat.TomcatWebServer [0;39m [2m:[0;39m Tomcat started on port(s): 8080 (http) with context path ''
[2m2019-05-18 15:33:56.310[0;39m [32m INFO[0;39m [35m10408[0;39m [2m---[0;39m [2m[ main][0;39m [36mmrs.MrsApplication [0;39m [2m:[0;39m Started MrsApplication in 3.322 seconds (JVM running for 3.935)
SQL文は上記のコードどおりといいましたがよくみるとこちらのコードは空白が抜けていたようなので修正しました。
だとあとコンバーターありだとWEBページも表示されずアプリケーションは終了します。エラー文は(コマンドプロンプトでテーブルを作っているにもかかわらず)missing tableです。また何の本のコードか明記していなかったのでかいておきますいておきます。
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発 Spring FrameworkによるJavaアプリケーション
14章チュートリアル
テーブル作成後http://localhost:8080/roomsにアクセスしたあとにコンソールに重要そうなエラーメッセージが追加されていたので追記しました
大変申し訳ございません。前回挙げた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件
あなたの回答
tips
プレビュー