はじめに
spring bootの2系がリリースされていたので、せっかくなのでバージョンアップした時のメモ
移行ガイドが公式から出ているのでこの手順に沿って行います。 Spring Boot 2.0 Migration Guide
また、こちらの記事は大変参考になりました。Spring Boot 1.5.10 → Spring Boot 2.0.0 にしたときの覚書
対応内容
プロパティチェックツールの導入
Before You Startに書いてあるようにbuild.gradle
に以下のように追加します。
runtime("org.springframework.boot:spring-boot-properties-migrator")
これでapplication.yml
の仕様変更分を警告してくれます。
gradleプラグイン関連の修正
依存関係を解決するプラグインの追加
Dependency Managementに書いてあるように依存関係を解決するプラグインを追加します。
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // <-- add this to your build.gradle
構文が変更されたapplication.yml の修正
spring.batch.initializer.enabled
が spring.batch.initialize-schema
に変更されていたのでこちらに変更します。
初期化はしないので never
を設定します。
Initialize a Spring Batch Database
- 変更前
spring:
batch:
initializer:
enabled: false
- 変更後
spring:
batch:
initialize-schema: never
application.yml 上でのキャメルケース廃止
application.yml 上でキャメルケースで設定したものがエラーになっていました。
ケバブケースにせよ。とのことなのでケバブケースにします。
- 変更前
spring:
datasource:
hogeHoge:
driverClassName: com.mysql.jdbc.Driver
- 変更後
spring:
datasource:
hoge-hoge:
driver-class-name: com.mysql.jdbc.Driver
build.gradleの構文変更
jar生成時の設定変更
以前まではパッケージ生成にbootRepackage
でjarファイルを生成していましたが、こちらが廃止されたようで、
bootJar
とbootWar
に置き換えられました。とありますが案件の設定の関係でbootJar
は enabled=false
にしました。
- 変更前
mainClassName = 'jp.co.hoge.fuga.App'
bootRepackage {
executable = true
}
jar {
manifest {
attributes 'GitHub-Branch-Name' : branchname
attributes 'GitHub-Commit-Hash' : commithash
}
}
- 変更後
ext.mainClass = 'jp.co.hoge.fuga.App'
bootJar {
enabled = false
}
jar {
enabled = true
manifest {
attributes 'GitHub-Branch-Name' : branchname
attributes 'GitHub-Commit-Hash' : commithash
}
}
gradlewのバージョンアップ
もともと使っていたgradlewは4.6でしたが、最新の4.7にあげておきます。
task wrapper(type: Wrapper) {
gradleVersion = "4.7"
}
コネクションプール周りの変更
HikariCP対応
以前まではtomcatのコネクションプールを使っていましたが、
HikariCPがデフォルトになったためそちらに変更します。
- 変更前
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.hoge")
public class DataSourceConfiguration {
private String driverClassName;
private String url;
private String username;
private String password;
private Boolean testOnBorrow;
private String validationQuery;
public DataSource dataSource() {
DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(driverClassName);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setTestOnBorrow(testOnBorrow);
ds.setValidationQuery(validationQuery);
return ds;
}
}
- 変更後
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.hoge")
public class DataSourceConfiguration {
private String driverClassName;
private String url;
private String username;
private String password;
private Integer maxPoolSize;
private String validationQuery;
public HikariDataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName(driverClassName);
ds.setJdbcUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setConnectionInitSql(validationQuery);
ds.setMaximumPoolSize(maxPoolSize);
return ds;
}
}
クエリタイムアウトなども設定するべきですが、長時間実行し続けるbatchからのsqlがあるので今回は設定しませんでした。
非推奨になったクラス、メソッドの修正
SpringMvcのJavaConfig更新
spring5になった関係でWebMvcConfigurerAdapter
が非推奨になりました。
WebMvcConfigurer
を使えとあるのでそちらに変更します。
default method使うようになったからみたいですね。
- 変更前
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
// 略
}
- 変更後
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 略
}
Md5PasswordEncoderの廃止
もともと非推奨ですが、廃止になったため変更が必要なりました。
- 変更前
@Bean
public PasswordEncoder md5PasswordEncoder() {
return new Md5PasswordEncoder();
}
- 変更後
@Bean
public PasswordEncoder md5PasswordEncoder() {
return new MessageDigestPasswordEncoder("MD5");
}
MD5の利用自体をやめたいですが、長く続く案件だとなかなか難しいので非推奨ですが一旦これで回避します。
DelegatingPasswordEncoderの使用
spring security5から追加されたので使用します。
パスワードのハッシュ化のアルゴリズムごとに適切な PasswordEncoderに処理を委譲してくれるようです。
デフォルトで設定してくれるクラスがあったのでPasswordEncoderFactories
を使用して生成させます。
デフォルトではbcryptを返してくれます。
@Bean
public PasswordEncoder delegatingPasswordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
org.hibernate.validator.constraints.NotBlankの変更
org.hibernate.validator.constraints.NotBlank
が非推奨になりましたので変更します。
同一クラス名でjavax.validation.constraints.NotBlank
が実装されているのでimportの箇所だけ一括置換すればOKでした。
こんな感じの対応で問題なく動くようになりました。
おわり