見出し画像

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'



この記事が気に入ったらサポートをしてみませんか?