Springboot1.5.x to 2.1.5 Upgrade【コンパイルエラー解消まで】
バージョン
2.1.5.RELEASE
参考にしたサイト
マイグレーションガイド
Spring Boot 1.5.10 → Spring Boot 2.0.0 にしたときの覚書
自力(ぐぐったりしたけど)で解決したやつ
SpringBootServletInitializer のパッケージが変更になった
import org.springframework.boot.web.support.SpringBootServletInitializer;
↓ これへ
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder のパッケージ変更
org.springframework.boot.jdbc.DataSourceBuilder に変更になった
型 CrudRepository<User,Integer> のメソッド save(S) は引数 (List<User>) に適用できません
継承してたのはJpaRepositoryの方なんですが。
JpaRepositoryからorg.springframework.data.repository.CrudRepository#save(java.lang.Iterable) がいなくなってsaveAllになったみたいです。
なので、リストをどーんと渡してたやつはおとなしくsaveAllに書き換えを。
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(java.lang.Iterable)
*/
<S extends T> List<S> saveAll(Iterable<S> entities);
戻りの型は CrudRepository<User,Integer>.findById(Integer) と互換性がありません
これもsaveAllと同じくメソッド名がfindByIdからgetOneに変わったっぽいです。findOneも同様です。
/**
* Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is
* implemented this is very likely to always return an instance and throw an
* {@link javax.persistence.EntityNotFoundException} on first access. Some of them will reject invalid identifiers
* immediately.
*
* @param id must not be {@literal null}.
* @return a reference to the entity with the given identifier.
* @see EntityManager#getReference(Class, Object) for details on when an exception is thrown.
*/
T getOne(ID id);
※2019/09/02追記
上記、ちょっと嘘でした。
findByIdは残っていて、戻り値がOptionalに変わっているだけです。
getOneを使うと遅延ロードになるみたいで、値の有無とかでnullを返してほしかった場合は、これまで通りfindByIdを使って、orとか使うのが良いみたいです。
Hoge hoge = hogeRepository.findById(id).orElse(null);
詳細はこちら。
Difference between getOne and findById in Spring Data JPA?
型 CrudRepository<User,ID> のメソッド delete(User) は引数 (ID) に適用できません
delete(ID) のメソッド名がdeleteByIdに変更になった。
/**
* Deletes the entity with the given id.
*
* @param id must not be {@literal null}.
* @throws IllegalArgumentException in case the given {@code id} is {@literal null}
*/
void deleteById(ID id);
org.springframework.data.repository.query.parser.OrderBySourceの削除
findAllの引数にソート条件を渡していたOrderBySourceが削除になり、org.springframework.data.domain.Sortを使うようにする。
/*
* (non-Javadoc)
* @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort)
*/
List<T> findAll(Sort sort);
こんな感じに書き換える。
userRepository.findAll(new OrderBySource("createdAt").toSort())
↓
userRepository.findAll(new Sort(Sort.Direction.ASC, "createdAt"))
org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer
org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer
の削除
使用していたコンテナがspringboot2から削除してしまったので、代替が必要。以下のクラスに置き換える。WebServerFactoryCustomizerは型定義が必要なのでcustomizeメソッドの引数のクラスと一致させる。
org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer
↓
org.springframework.boot.web.server.WebServerFactoryCustomizer
org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer
↓
org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory
org.springframework.boot.web.servlet.ErrorPage のパッケージ変更
新パッケージはこれ
org.springframework.boot.web.server.ErrorPage
インポートされた org.mockito.internal.util.reflection.Whitebox は見つかりません
springbootに内包されているmockitoも2.15に上がっていたことにより、プライベートフィールドに値をセットしていたWhiteboxクラスがいなくなっていた。
2個目の回答にあるように、ReflectionTestUtilsを使うと良さそう。
Whitebox.setInternalState
↓
ReflectionTestUtils.setField
Selenium周りの話
ついでに2.x系から3系に上げた
HtmlUnitDriverが見つからない
seleniumからhtmlunit-driverが分離したのかな?
Gradleにhtmlunit-driverを追加する。
compile group: 'org.seleniumhq.selenium', name: 'htmlunit-driver', version: '2.35.1'
型 org.openqa.selenium.WrapsDriver を解決できません。必要な .class ファイルから間接的に参照されています
selenium-api梱包されてるはずだけど??ともあれ追加。
// https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api
compile group: 'org.seleniumhq.selenium', name: 'selenium-api', version: '3.141.59'
この記事が気に入ったらサポートをしてみませんか?