Spring徹底入門14章チュートリアルをやった
SpringBootをKotlinで使う用事が出来たのですが、SpringもSpringBootもKotlinも未だ使ったことが無かったため、各個撃破すべく各所でオススメされていた「Spring徹底入門」を読みました。
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者:株式会社NTTデータ
- 発売日: 2016/07/20
- メディア: Kindle版
「ざっと前半を斜め読みしてから、14章のチュートリアルで写経をし、その中でそれまでの章を再度見直す」という方針で進めたのですが、発売されてからだいぶ時間が経っているため、そのままだと動かない場所も。
指示通りではなく自分の都合で違うやり方をした部分もありますが、一応は完走できたため、詰まったところについてメモを書き残しておきます。
(ただの読み落としで詰まっただけのところもあるかと思う。その点はご容赦のほどを...)
前提
package名
SpringBootのinitializerで、app名をそのままpackage名にできなかったが、 とりあえずcom.app_name とすればとりあえずはよくて、 その後作ったクラスとかも package com.app_name.*** としておいたが、不具合は特に起きなかった。
databaseに接続ができなかった件
*************************** APPLICATION FAILED TO START *************************** Description: Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource: Property: driver-class-name Value: org.postgresql.Driver Origin: "driverClassName" from property source "source" Reason: Failed to load driver class org.postgresql.Driver in either of HikariConfig class loader or Thread context classloader Action: Update your application's configuration
以下のように対処
- build.gradleのdependenciesに以下を追加
runtimeOnly 'org.postgresql:postgresql'
- application.propertiesに以下を追加
spring.datasource.driver-class-name=org.postgresql.Driver
resources/schema.sqlを置いておいても勝手に読みに来てくれない件
以下をapplication.propertiesに書いて解决
spring.datasource.initialization-mode=always
alwaysで良いかどうかはその都度判断すること
TIMESTAMP型に関するエラー
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [reserved_date] in table [reservable_room]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]
JPA2.2からは、Tutorialで自力でConverter作ってた部分は不要。 LocalDate、LocalTime、LocalDateTimeのConverterをTutorialでは作ってたけど、かえって悪さをする。 converter消したら解决。
findOne(id)がない
SpringBoot2以降(1.5.15より後?)だと、JPAにfindOne(id)がない。
findById(id)なら使える。 ただし返却されるのがOptional型なので、
Hoge.findById(id).orElse(null)
などとすれば一旦は動く。
ただしTutorialに限った話。他の場面では適切なものを選択すること
javax.validation
javax.validationがそのままだと使えなかったので、build.gradleに以下を足した
implementation 'javax.validation:validation-api:2.0.1.Final' runtimeOnly 'org.glassfish:javax.el:3.0.1-b11'
WebSecurityConfigの置き場所
com.app_nameの直下に置く
参考情報
参考になった: qiita.com