Mais conteúdo relacionado
Semelhante a What's new in Spring Boot 2.6 ? (20)
What's new in Spring Boot 2.6 ?
- 2. 自己紹介
• 土岐 孝平
• 合同会社 現場指向
– Springのオンライン研修
– スポット技術支援
– メモラキー
• 書籍の執筆
2
[改訂新版]Spring入門 OpenID Connect入門
「ゼロ・トゥー・ヒーロー with Spring」
~ 5日間でゼロから即戦力へ ~
現場指向
🔍
4月開催
☆限定割引中☆
- 6. 紹介する変更点
• 旧バージョンから変わったこと
– 循環参照がデフォルト禁止
– Spring MVCのパスマッチングの実装が変わった
– 「info.xxx」プロパティがデフォルト無効
– recordクラスの@ConstructorBindingが不要
• 新しく追加された機能
– SameSiteクッキーの設定が可能
– Actuatorで秘密情報をサニタイズするIFが追加された
– @AutoConfigureMockMvcでWebTestClientが利用可
能
– infoエンドポイントでJava実行環境の情報を取得可能
– 起動時間のメトリクスが取得可能 6
- 14. Spring MVCのパスマッチングの実装が変わった
• パスマッチングがでてくる箇所
– Spring MVC
• @GetMapping("/foo"), @PostMapping("/foo"), ...
– Spring Security
• mvcMatchers("/foo")
• AntPathMatcherから、PathPatternParserに変わっ
た
– 基本的には性能改善が目的の様子
– 使い方はほぼ同じだが、違いもある
– 設定で元に戻すことも可能
• 「spring.mvc.pathmatch.matching-strategy=ant-
path-matcher」
14
- 16. Spring Securityでの注意点
• 先頭の「/」を厳密にマッチさせるようになった
• 「/admin/secret」にアクセスがあった場合、has
Authority("ADMIN")の権限チェックが行われない
– その下のpermitAll()になってしまう
• 権限チェックが行われるようにするには、「
.mvcMatchers("/admin/secret")」にする必要がある
16
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeHttpRequests()
.mvcMatchers("admin/secret").hasAuthority("ADMIN")
.anyRequest().permitAll();
}
- 21. recordクラスの@ConstructorBindingが不要
• recordクラスとは?
– Java 16から追加された言語仕様
– コンストラクタ、Getter、toString、equals、hashCodeが
自動生成される
21
public record FooProps(String abc, String def) {
}
FooRecord fooProps = new FooProps("xxx", "yyy");
System.out.println(fooProps.abc() + ":" + fooProps.def());
// 「xxx : yyy」が出力される
public record FooProps(String abc, String def) {
public String concat() {
return this.abc + this.def;
}
}
メソッドも作れる。
※フィールドはfinalなので変
更不可
コンストラクタやGetterが
自動生成されている
- 26. SameSiteの属性値の種類
• Strict
– 送信しない
• None
– 送信する
• Lax
– リンクなどユーザのアクションでアクセスされたときだけ送
信する
26
<html>
<img src="www.me.com/foo">
<a href=" www.me.com/foo">リンク</a>
</html>
リンクで辿った場合は送信
www.other.comの画面
こっちは送
信しない
- 27. Spring Bootで設定可能
• セッションIDの場合
– server.servlet.session.cookie.same-site=lax
• それ以外の場合
– 新しく追加されたCookieSameSiteSupplierを使用する
27
@Bean
public CookieSameSiteSupplier cookieSameSiteSupplier() {
return CookieSameSiteSupplier.ofLax()
.whenHasNameMatching("myapp.*");
}
@GetMapping("/cookie")
public String foo(HttpServletResponse res) {
res.addCookie(new Cookie("myapp_abc", "pppppppp"));
return "foo";
}
Java標準だとSameSiteを
設定するメソッドが無い
Spring Bootが上手いこと
設定してくれる
Set-Cookie: JSESSIONID=xxx; Path=/; HttpOnly; SameSite=Lax
- 33. @AutoConfigureMockMvcでWebTestClientが利用可能に
• これまでのWebのテスト
33
@WebMvcTest(controllers = FooController.class)
public class FooControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void foo() throws Exception {
mockMvc.perform(get("/foo"))
.andExpect(status().isOk());
}
}
@SpringBootTest(webEnvironment =
WebEnvironment.RANDOM_PORT)
public class FooIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void foo() {
ResponseEntity<String> entity =
restTemplate.getForEntity("/foo", String.class);
assertThat(entity.getStatusCode())
.isEqualTo(HttpStatus.OK);
}
}
テストメソッドの書き方が
変わってしまう(開発者の
学習コストが増える)
【Controllerの単体テスト】
【APサーバ起動した結合テスト】
- 34. @AutoConfigureMockMvcでWebTestClientが利用可能に
34
@WebMvcTest(controllers = FooController.class)
public class FooControllerTest {
@Autowired
private WebTestClient client;
@Test
public void foo() {
client.get().uri("/foo").exchange()
.expectStatus().isOk();
}
}
@SpringBootTest(webEnvironment =
WebEnvironment.RANDOM_PORT)
public class FooIntegrationTest {
@Autowired
private WebTestClient client;
@Test
public void foo() {
client.get().uri("/foo").exchange()
.expectStatus().isOk();
}
}
@WebMvcTestの中の
@AutoConfigureMockMvcによって
WebTestClientがコンフィグレーションされる
テストメソッドを同じ書
き方で記述できる(開発
者の学習コストが減る)
• 可能になった書き方
【注意】裏でWebClientが使うため
「spring-boot-starter-webflux」の依存が必要
【Controllerの単体テスト】
【APサーバ起動した結合テスト】
- 42. 余談:spring.config.importが便利そう
• 利用のアイデア
– 実行環境に用意した秘密情報のプロパティファイルを読
込んでデフォルトを上書き
– 開発者がローカルで自由に記述できるプロパティファイル
を読込む
42
some.secret.aaa=for_local
some.secret.bbb=for_local
some.secret.ccc=for_local
spring.config.import=optional:file:secret.properties
spring.config.import=optional:developer.properties
application.properties
some.prop=・・・
ローカルのdeveloper.properties
.gitignoreなどでSCMに登
録しないようにする
some.secret.aaa=aaa123
some.secret.bbb=bbb123
some.secret.ccc=ccc123
本番環境のsecret.properties
application.properties