afnf.net

Spring Boot 1.3 への移行 (1)

blog-java2ブログエンジンをSpring Boot 1.3.0 M4にアップグレードしてみました。

3件の修正を行ったのでご紹介。

※2015/09/06追記 4件目を別エントリに追加しました。

Spring Security 4.0への移行に伴う変更

Spring Boot 1.3 では Spring Security 4.0 への移行が発生します。詳細については以前書いた移行のエントリを参考にしてください。

これとは別に、Java Configでコンパイルエラーが発生しました。以前書いた Spring Securityのdisable順序 の件にも少し関連します。

  // 変更前
  .and()
  .csrf().disable()
  .headers().cacheControl().disable()  
  .headers().httpStrictTransportSecurity().disable()  
  .headers().contentTypeOptions().frameOptions().xssProtection()

2回目、3回目のheaders()がコンパイルエラーになります。以下のように修正しました。

  // 変更後
  .and()
  .csrf().disable()
  .headers().cacheControl().disable() 
  .httpStrictTransportSecurity().disable()

CSRFやHTTPヘッダ関係のセキュリティ設定が、デフォルトで全て有効になったので、無効にしたいものを列挙するだけになりました。より直感的になっています。

MyBatisに関する修正

Spring Boot 1.3 でも、MyBatis 3.3.0 + mybatis-spring 1.2.3が使用できます。ただ、JavaConfigを変更する必要がありました。

// 変更前
@Configuration
@MapperScan("net.afnf.blog.mapper")
public class MyBatisConfig {

  @Bean
  @ConfigurationProperties("spring.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean
  public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource());
    sqlSessionFactoryBean.setTypeAliasesPackage("net.afnf.blog.domain");
    return sqlSessionFactoryBean.getObject();
  }
}

問題点は2つありました。

まず、@ConfigurationProperties("spring.datasource")が効きません。結果、DataSourceがデフォルト値になってしまうようです。DriverClassNameやJDBC URLもnullのままなので、以下のようなエラーになりました。

o.a.tomcat.jdbc.pool.PooledConnection(180) - Not loading a JDBC driver as driverClassName property is null.
o.apache.tomcat.jdbc.pool.ConnectionPool(182) - Unable to create initial connections of pool.
java.sql.SQLException: The url cannot be null

詳細未調査。良く分かりませんが@AutoWireも効きません。仕方ないので、@Qualifier("dataSource")を使います。こっちは効きました。

もう1つの問題は、@MapperScan("net.afnf.blog.mapper")です。これがあると、なぜか無限ループになります。循環参照のようです。

o.s.b.f.s.DefaultListableBeanFactory(1479) - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.UnsatisfiedDependencyException

アノテーションは使用せず、JavaConfigを使用することで解消できました。結果、以下のようになりました。

// 変更後
@Configuration
public class MyBatisConfig {

  @Bean
  public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    sqlSessionFactoryBean.setTypeAliasesPackage("net.afnf.blog.domain");
    return sqlSessionFactoryBean.getObject();
  }

  @Bean
  public MapperScannerConfigurer mapperScannerConfigurer() throws Exception {
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    mapperScannerConfigurer.setBasePackage("net.afnf.blog.mapper");
    return mapperScannerConfigurer;
  }
}

logback設定ファイルの名称変更

logback.xmlのファイル名をlogback-spring.xmlに変更しました。変更前はテスト時にLOG_PATH_IS_UNDEFINEDLOG_FILE_IS_UNDEFINED というファイルが生成されてしまっていたのですが、これが抑止されるようになりました。

ソースコード

ブランチをGitHubにpushしました。

https://github.com/af-not-found/blog-java2/tree/springboot13

該当コミットはこれです。

https://github.com/af-not-found/blog-java2/commit/dde8a4e10bf73feda2d33a1c6e5a37319b1d9c7e

続き

Spring Boot 1.3 への移行 (2)

comments (0)

blog-java2 engine (build:2017-08-10 17:37 JST)