blog-java2ブログエンジンをSpring Boot 1.3.0 M4にアップグレードしてみました。
3件の修正を行ったのでご紹介。
※2015/09/06追記 4件目を別エントリに追加しました。
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ヘッダ関係のセキュリティ設定が、デフォルトで全て有効になったので、無効にしたいものを列挙するだけになりました。より直感的になっています。
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.xml
のファイル名をlogback-spring.xml
に変更しました。変更前はテスト時にLOG_PATH_IS_UNDEFINED
や LOG_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