我有以下界面,该界面由我的几个存储库接口扩展:
public interface IdentifiableEntityRepository<T, ID extends Serializable> {
@RestResource(path="findAll")
public List<T> findByIdIn(@Param("ids") List<ID> ids);
}
这是一个碰巧有字符串ID的存储库示例:
public interface FooRepository extends IdentifiableEntityRepository<Foo, String>,
PagingAndSortingRepository<Foo, String>
{
...
}
...和另一个恰好有长ID的例子:
public interface BarRepository extends IdentifiableEntityRepository<Bar, Long>,
PagingAndSortingRepository<Bar, Long>
{
...
}
对于String示例,我能够成功查询findAll端点,如下所示:
GET /api/data/foo/search/findAll?ids=eenie,meenie,miney,moe
但是对于Long示例,类似的查询会产生500服务器错误
GET /api/data/bar/search/findAll?ids=1035,1036,1042,2048
{
"timestamp": "2017-02-17T00:00:33.547Z",
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
"message": "org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value element [1035] did not match expected type [java.lang.Long (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [1035] did not match expected type [java.lang.Long (n/a)]",
"path": "/api/data/bar/search/findAll"
}
在org.hibernate.jpa.spi.BaseQueryImpl.validateCollectionValuedParameterBinding()
的Hibernate JPA中引发了IllegalArgumentException。当我在那里放置一个断点时,很明显以逗号分隔的字符串作为&#34; ids&#34;查询参数被成功解析为List<String>
,然后通过各层(spring-data-rest - &gt; spring-data - &gt; spring-data-jpa - &gt; hibernate-jpa)。然后,注释的BaseQueryImpl方法迭代String元素检查以查看它们是否是预期的Long类型的实例。他们不是,因此,IllegalArgugmentException。
我还尝试过以下方法:
GET /api/data/bar/search/findAll?ids=1035l,1036l,1042l,2048l
...但这也给出了同样的错误。
所以问题:我真的想在IdentifiableEntityRepository接口中使用通用的,泛型增强的方法声明,以便我可以在多个存储库中重用它。有没有办法解析&#34; ID&#34;查询参数类型感知,以便它可以使用非字符串ID吗?