有人可以帮我吗?实际上,我有一个使用Spring Boot / Spring Data-REST的项目。在我的自定义存储库界面中,我创建了一个新方法,如下所示:
@Query("SELECT h FROM History h WHERE " +
" (:fromDate IS NULL OR h.date >= :fromDate)" +
" AND (:toDate IS NULL OR h.date <= :toDate)" +
" AND (:ids IS NULL OR h.id IN :ids)")
Page<History> findHistoryByCriteria(
@Param("fromDate") @DateTimeFormat(pattern = "MM/dd/yyyy") Date fromDate,
@Param("toDate") @DateTimeFormat(pattern = "MM/dd/yyyy") Date toDate,
@Param("ids") List<Integer> ids);
当我使用URL http:// {hostname}:{port} / {context} /...?fromDate=08/01/2016&toDate=08/31/2016&ids [] = 1&ids []调用它时= 2,我得到错误的结果。在日志中,我得到
TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [5] as [INTEGER] - [null]
TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [6] as [INTEGER] - [null]
并且如果我尝试使用http:// {hostname}:{port} / {context} /...?fromDate=08/01/2016&toDate=08/31/2016&ids=2,则返回给我一个有效的结果。
如果我尝试使用http:// {hostname}:{port} / {context} /...?fromDate=08/01/2016&toDate=08/31/2016&ids=2&ids=3,我得到一个例外
nested exception is java.lang.IllegalArgumentException: Parameter value element [1] did not match expected type [java.lang.Integer (n/a)]: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value element [1] did not match expected type [java.lang.Integer (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [1] did not match expected type [java.lang.Integer (n/a)]
我应该如何调用包含多值参数(数组)的URL,或者应如何使它将该参数视为数组或集合?
先谢谢您。
对于几年后收到此答复的人,因为它是google搜索结果的顶部,所以我遇到了同样的问题,并发现了以下内容:
如果在存储库方法中使用Collection类型作为参数,则使SD Rest正确转换的唯一方法是在注释状态上方的Rindra中,将值作为逗号分隔的字符串传递到单个查询参数中。它不会接受具有不同值的相同名称的多个参数。这是因为转换代码不够智能,无法知道所提供的集合(例如List)与预期的集合(例如List)不同,因为它不查看内部集合类型。它只是看到需要一个List并提供了List,因此它跳过了任何转换尝试。
也就是说,如果您使用数组(Integer [])而不是集合,则可以在单个查询参数中将值作为逗号分隔的字符串传递,而在多个查询参数中作为单个值传递。
归结为转换服务中可用的注册转换器。如果是“?ids = 123,432”,则有一个StringToCollectionConverter,如果是“?ids = 123&ids = 432”,则有一个CollectionToArrayConverter。