Gradleプラグイン/アノテーションプロセッシング調査
元々JBoss/WildFlyの流れで開発してきたのでずっとMavenを利用してきたのですが、今度のプロジェクトではGradleを使うことに決まったようで、新しい知識が必要となりました。
ISO 8601では 24:00 は妥当だったが改訂によりNGになった
ISO 8601 の以前のspecでは、 0:00 も 24:00 も両方妥当な表記だったらしいです。
実際、"ISO8601 24:00" みたいなキーワードで検索するとそのように説明しているサイトも複数ヒットします。
Spring Boot で Controller と Repositoryを同じクラスで併用する
…なんてことができたんですね。こんなコード:
@RestController
@Repository
public interface VehicleInterface extends JpaRepository<vehicle, Long> {
@Query("select u from vehicle u where u.year = :year")
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
List<vehicle> findByYearEquals(@Param("year") Integer year);
}
http://localhost:8080/vehicles?year=2010 的なURLでアクセスします。
Spring-BootでJSPを使う
https://start.spring.io/ で depencencies に Spring Web を追加して生成します。
生成された pom.xml に次の依存関係を追加します:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<!-- 必要に応じて -->
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
appliction.properties に次を追加します:
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
src/main/webapp/WEB-INF/view/ の下に JSP ファイルを作成します。
Spring Boot でなるべく依存関係を小さくしてWebMVCを使ってみる
特に実用性とかは考えていない。何となくやってみたというだけ。
動かしたいやつ
|
|
設定
|
|
|
|
|
|
${...}と#{...}の違い
より。
${…} は単なるプロパティのプレースホルダ。
#{…} は Spring Expression Language(SpEL) の構文。
プレースホルダは置き換えるだけだけれども、SpELはもっと複雑なこともできる(Javaのメソッドを呼び出したりとか)。
Spring 2.3.0 で時刻オフセットの書式コロン付き+09:00みたいに変わっとるやん
正確には jackson-databind 2.11.0 で。
- jackson 2.11 リリースノート
- Change default textual serialization of
java.util.Date/Calendarto include colon in timezone offset #2643
このへん見ると分かるけど、Spring Boot 2.2 系列は jackson-databind 2.10.x が採用されていて、 2.3.0 で 2.11.0 が採用されている。
コード:
|
|
結果(2.2.8):
…Spring Boot 2.3.0 から H2Database の名前 jdbc:h2:mem:testdb じゃなくなっとるやん(デフォルトでは)
前はここに書いた通り固定で jdbc:h2:mem:testdb という名前だったのにこれでアクセスできんようになってしもた。
起動ログに
o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:30591993-9fe2-4068-a5e2-05b263e3495b'
みたいに出るのでここで確認しよう。
というか、素直にプロパティで
Spring MVCにはJPA EntityのIDからエンティティオブジェクトに変換する機能がある(が、2.3.1では機能しない)
追記: 2020-07-24にリリースされた2.3.2, 2.2.9 でこの問題は修正されました。ただし、2.1.16では未修正のままのようでした。
Spring Bootは Spring Data Commons を利用して、Thymeleaf(など)からのリクエストからオブジェクトへ変換する際、Sprint Data JPAと連携して、IDからエンティティオブジェクトへマッピングする機能があります(3.2. Property population)。
Spring Security OAuth 2.0 Client(OAuth 2.0 Login)でトークンの管理をしているのはOAuth2AuthorizedClientService
私も今回の質問(本文末参照)を見たとき少しの間勘違いしてしまったのですが、OAuth2.0のクライアントがどこで各リソースオーナーのトークンを管理しているかと言うと、アプリケーションコンテキストであって、ユーザのセッションコンテキストなわけが無いですよね…
Spring BootのGradleでのデバッグ実行方法
gradle bootRun --debug-jvm
というように、--debug-jvm オプションを付与すれば良いようです。
これで、デバッガ接続の待受状態で起動します。
So many UserDetailsService samples considered harmful for beginners
やっぱり一発目の Spring Security やってみたで UserDetailsService 使うのは止めようず。So many UserDetailsService samples considered harmful for beginners.
はじめに
ちょっと待って!その UserDetails、本当に必要ですか?で書いたことの繰り返しなんですけども。
…List#contains(null)は使わないほうが良い
List(などのコレクション)が要素に null を含むかどうかの判定に、 contains(null) を利用すると NullPointerException が発生することがあります。
リファレンスには次のようにあります: