見出し画像

Springboot1.5.x to 2.1.5 Upgrade【その他不具合解消編】

コンパイルエラーを解消したところまでは以下を参照のこと。

型 NotEmpty は使用すべきではありません

org.hibernate.validator.constraints.NotEmpty やNotBlankなどhibernate validatorは非推奨になってました。

use the standard NotEmpty constraint instead

とあるので、標準(javax.validation.constraints)を使えばOKです。
message.properties使ってる場合は、そちらも変更するのを忘れずに。

import org.hibernate.validator.constraints.NotEmpty;
        ↓
import javax.validation.constraints.NotEmpty;

他のアノテーションはjavax.validation.constraints 使ってたのに、NotEmptyだけhibernateのを使ってたんだろう・・・(前はなかったとか?)

起動時エラー
Duplicate annotation for class: interface javax.validation.constraints.Pattern: @javax.validation.constraints.Pattern

一箇所だけ『@Pattern.List』を使ってたんですが、それが駄目になったっぽいです。こんな感じ↓

@Pattern.List({
	@Pattern(regexp = "[A-Z0-9]{2}", groups = 条件1, message="半角大文字英数字の2文字で入力してください"),
	@Pattern(regexp = "[A-Z0-9]{4}", groups = 条件2, message="半角大文字英数字の4文字で入力してください")
})
private String hoge;

同じ内容で詰まってた人が案の定stack overflowにいたので感謝。

@Pattern.Listを取っ払って良いみたいです。
変更後↓

@Pattern(regexp = "[A-Z0-9]{2}", groups = 条件1, message="半角大文字英数字の2文字で入力してください")
@Pattern(regexp = "[A-Z0-9]{4}", groups = 条件2, message="半角大文字英数字の4文字で入力してください")
private String hoge;

MultiDataSourceの場合

MySQLとPostgres使ってるのでいろいろ大変です。が、思いの外すぐ動いたから良かった。

ここが一番綺麗に書いてくれてるかも

動画もわかりやすいかも(説明しながらだからちょっと遅いけど)

HHH000342: Could not obtain connection to query metadata : Driver org.postgresql.Driver claims to not accept jdbcUrl, postgresql://localhost:5432/xxxx

接頭詞に『jdbc:』が必要になったみたいです。MySQLも同様ですが。

url: jdbc:postgresql://localhost:5432/xxxx

ログイン時にエラー
There is no PasswordEncoder mapped for the id "null"

LDAPも使ってるんですけど、一部ユーザは固定アカウントだなので、このエラーが発生しました。spring-security-core:5.0.0.RC1から変わったらしい。生パスワード保存するなよ!って話です。

ここに書いてるやり方でいけるみたいなんですが、私の環境だとUserオブジェクト作ってなかったので、パスワード設定書いてるところに『{noop}』追加するパターンでいけました。

JpaRepositoryのgetOneを使うようになったら、findByIdのときはnullが返ってたのに、javax.persistence.EntityNotFoundExceptionが発生するようになった

コメントにちゃんと書いてました。。

	/**
	 * 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);

詳細はここのサイトに書いてるんで、読んでなんとなくふーんと思えばいいと思いますwが、実際にテーブルに対象のデータが入ってないとかを知りたいときは、getOneじゃなくてfindByIdを使うほうが良いです。
ただ、戻り値はOptionalに変わってるので、orElse使うとかよしなに。

Hoge hoge = hogeRepository.findById(period).orElse(null);

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