SpringData的DomainClassConverter是否应该与Hibernate代理一起使用?

时间:2017-11-15 23:12:06

标签: hibernate spring-boot spring-data thymeleaf

我的团队维护着一个使用Spring Boot,Spring Data,Thymeleaf和JPA / Hibernate构建的Web应用程序。我们最近遇到了由于类型转换问题导致Thymeleaf模板SpringEL表达式无法评估的问题:

  

引起:org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型[com.xyz.app.model.Employee _ $$ _ jvst7ca_34]转换为类型[java.lang.String]的转换器

表达式是$ {{employee}},其中employee是Spring控制器放入模型的实体。通过简单调用Spring Data存储库来检索employee实体:

@ModelAttribute("employee")
public Employee getEmployee(@PathVariable("employeeId") long employeeId) {
    return employeeRepository.findOne(employeeId);
}

在调试时,我注意到返回的Employee实体实际上是一个Hibernate代理,正如您在日志中看到的异常原因 - Employee类具有javassist后缀:_$$_jvst7ca_34

Spring Data向DomainClassConverter注册GenericConversionService,当@EnableSpringDataWebSupport注释出现时,它应该将实体转换为类似$ {{employee}}的表达式的ID。 Spring Boot提供了一个自动配置类SpringDataWebAutoConfiguration,它默认启用此功能。我确认我们的应用程序已应用此自动配置类。

我还通过调试确认GenericConversionService在尝试从Employee _ $$ _ jvst7ca_34转换为String时检索DomainClassConverter.ToIdConverter。但是DomainClassConverter.ToIdConverter.matches(sourceType, targetType)返回false,因此不使用转换器。它返回false,因为它无法在Repositories中找到类型为Employee_$$_jvst7ca_34的存储库。我在调试器中看到,存储库列表中唯一的Employee存储库是Employee

这是DomainClassConverter中的错误吗?它不应该能够检索代理的存储库吗?看起来代理应该很常见,因为任何具有延迟集合的实体(推荐的集合类型)都将作为代理返回。或者我们做错了什么?任何提示都将非常感激!

1 个答案:

答案 0 :(得分:0)

事实证明这是Spring Data Commons中的一个错误。 issue现已得到解决,在未来的版本中,应该可以转换代理。