Spring Boot でなるべく依存関係を小さくしてWebMVCを使ってみる


特に実用性とかは考えていない。何となくやってみたというだけ。

動かしたいやつ

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/")
public class MyController {

    @GetMapping("/")
    public String index() {
        return "hello";
    }
}

設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-core</artifactId>
    </dependency>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
@Configuration
@EnableWebMvc
public class WebConfig {

    @Bean
    ServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory(8080);
    }

    @Bean
    DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }
}
1
2
3
4
5
6
@ComponentScan
public class MyApplication {
	public static void main(final String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}
}
Read more ⟶

${...}と#{...}の違い


より。

${…​} は単なるプロパティのプレースホルダ。

#{…​}Spring Expression Language(SpEL) の構文。

プレースホルダは置き換えるだけだけれども、SpELはもっと複雑なこともできる(Javaのメソッドを呼び出したりとか)。

Read more ⟶

Spring 2.3.0 で時刻オフセットの書式コロン付き+09:00みたいに変わっとるやん


正確には jackson-databind 2.11.0 で。

このへん見ると分かるけど、Spring Boot 2.2 系列は jackson-databind 2.10.x が採用されていて、 2.3.0 で 2.11.0 が採用されている。

コード:

1
2
3
4
    @GetMapping("/")
    public Date date() {
        return new Date();
    }

結果(2.2.8):

Read more ⟶

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'

みたいに出るのでここで確認しよう。
というか、素直にプロパティで

Read more ⟶

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)。

Read more ⟶

Spring Security OAuth 2.0 Client(OAuth 2.0 Login)でトークンの管理をしているのはOAuth2AuthorizedClientService


私も今回の質問(本文末参照)を見たとき少しの間勘違いしてしまったのですが、OAuth2.0のクライアントがどこで各リソースオーナーのトークンを管理しているかと言うと、アプリケーションコンテキストであって、ユーザのセッションコンテキストなわけが無いですよね…

Read more ⟶

Spring BootのGradleでのデバッグ実行方法


gradle bootRun --debug-jvm

というように、--debug-jvm オプションを付与すれば良いようです。 これで、デバッガ接続の待受状態で起動します。

BootRunJavaExec を継承していますが、この --debug-jvm は後者のリファレンスで言及されています。

Read more ⟶

So many UserDetailsService samples considered harmful for beginners


やっぱり一発目の Spring Security やってみたで UserDetailsService 使うのは止めようず。So many UserDetailsService samples considered harmful for beginners.

はじめに

ちょっと待って!その UserDetails、本当に必要ですか?で書いたことの繰り返しなんですけども。

Read more ⟶

List#contains(null)は使わないほうが良い


List(などのコレクション)が要素に null を含むかどうかの判定に、 contains(null) を利用すると NullPointerException が発生することがあります。

リファレンスには次のようにあります:

Read more ⟶

UserDetailsServiceは誤解されている


サンプルコード等だけを見ていると UserDetailsService を利用することがSpring Securityの唯一の認証処理実現方法だと誤解しがちですが、 UserDetailsService はむしろユーティリティライブラリくらいの立ち位置で、別に利用しなくても実現可能です。

Read more ⟶

Alpine Linuxでglibcじゃないことに起因する問題ってちょくちょくあるよね


…と少し思い返していました。といっても思い出せたのは次の2つなのですが。

Alpine特有の問題については、「取り敢えずglibc/GNU版コマンドをインストールしてみろ」ってのが最初に採ってみる方策としてアリなのかも。

Read more ⟶

CompletableFuture覚え書き


CompletableFuture の一連の非同期処理 ほげAsync は、デフォルトでは ForkJoinPool.commonPool() という ExecutorService で実行されます。

そしてこの ExecutorService のワーカスレッドはデーモンスレッドであるため、非デーモンスレッドが無くなると(≒ メインスレッドが終了すると)プール内の処理を完了させること無くプロセスが終了します。

Read more ⟶

Javaのソースファイルはpackageに対応したディレクトリ階層に置かなくても良い?


packageの宣言と実際のディレクトリが一致していなくてもmvn compile(やjavac)が成功するんですが、そういうもんでしたっけ?

Read more ⟶