Spring徹底入門14章チュートリアルをやった

SpringBootをKotlinで使う用事が出来たのですが、SpringもSpringBootもKotlinも未だ使ったことが無かったため、各個撃破すべく各所でオススメされていた「Spring徹底入門」を読みました。

「ざっと前半を斜め読みしてから、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