私のチームは、Spring Boot、Spring Data、Thymeleaf、およびJPA/Hibernateで構築されたWebアプリケーションを管理しています。SpringDataのDomainClassConverterはHibernateプロキシで動作するはずですか?
によって引き起こさ::org.springframework.core.convert.ConverterNotFoundException:我々は最近、原因型変換の問題に評価することができないThymeleafのテンプレートSpringEL式の問題を打つませコンバータは、タイプ[COMから変換することが可能見つかりません.xyz.app.model.Employee _ $$ _ jvst7ca_34]入力する[java.lang.Stringで]
式は、従業員がスプリングコントローラによってモデルに配置されたエンティティである$ {{}}従業員です。従業員エンティティは春データリポジトリへの単純な呼び出しで取得されます。デバッグ中
@ModelAttribute("employee")
public Employee getEmployee(@PathVariable("employeeId") long employeeId) {
return employeeRepository.findOne(employeeId);
}
、私はあなたがログから例外要因に見ることができるようにエンティティが返された従業員が、実際にはHibernateの代理であることに気づきました - Employeeクラスは、Javassistのサフィックスを持っています_$$_jvst7ca_34
春データは、SpringのGenericConversionService
@EnableSpringDataWebSupport
注釈が存在している$ {{}}従業員のような発現のためのIDにエンティティを変換するべきでDomainClassConverter
を登録します。 Springブートは自動設定クラスSpringDataWebAutoConfiguration
を提供し、デフォルトでこれを有効にします。私は、この自動設定クラスがアプリケーションによって適用されていることを確認しました。
また、GenericConversionService
がDomainClassConverter.ToIdConverter
を取得したことをデバッグによって確認したところ、Employee _ $$ _ jvst7ca_34からStringに変換しようとしました。ただし、DomainClassConverter.ToIdConverter.matches(sourceType, targetType)
はfalseを返しますので、コンバータは使用されません。 Employee_$$_jvst7ca_34
のRepositories
のリポジトリが見つからないため、falseを返します。デバッガでは、リポジトリリストの従業員リポジトリが唯一Employee
であることがわかります。
DomainClassConverter
のバグですか?プロキシのリポジトリを取得することはできませんか?遅延プロキシを持つエンティティ(推奨収集タイプ)がプロキシとして戻ってくるので、プロキシはかなり共通しているようです。それとも、何か間違っているのですか?どんなヒントも非常に高く評価されます!