从Spring 3升级到Spring 4后,Hibernate模板出现不兼容类型错误



我正在尝试升级一个应用程序以使用最新版本的Spring。它目前使用Spring 3.0.7和Hibernate 3.5.6。我能够成功地将其升级到Spring3.2.8,但如果我将其升级为Spring4,我会遇到如下编译错误:

[ERROR] /Users/mraible/dev/foo-upgrades/foo-core/src/main/java/com/company/foo/dao/companydb/impl/hibernate/InFaxDAOImpl.java:[71,82] incompatible types
[ERROR] required: java.util.List<com.company.foo.common.domain.FaxPage>
[ERROR] found:    java.util.List<capture#49 of ?>

方法调用如下所示:

List<FaxPage> faxPages = getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, hqlParams, values);

我可以通过转换为列表类型来修复编译错误,但这似乎不对。

List<FaxPage> faxPages = (List<FaxPage>) getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, hqlParams, values);

Spring 4是什么破坏了Hibernate DaoSupport,使其不向后兼容?

这是因为Spring框架用于返回原始列表声明,而该原始列表声明基本上允许您声明所需的任何类型。如果这样做,编译器将发出一个警告,该警告可以通过@SuppressWarnings("unchecked")声明"忽略"。

虽然可以提供向后兼容性,但许多参考文献建议永远不要在"新代码"中使用原始列表。

引用Java语言规范

只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言引入泛型之后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型。

这条线索很好地概括了这件事。

虽然我可以肯定地理解你过去所能做的事情的好处,但我建议你像以前一样更新你的代码,是的:无论如何,你以前都在做隐式转换。

最新更新