Spring Data REST:存储库多个值请求参数

时间:2016-08-31 14:02:23

标签: spring spring-mvc spring-boot spring-data-jpa spring-data-rest

有人可以帮我吗?实际上,我有一个使用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);

当我使用网址 http:// {hostname}:{port} / {context} /...?fromDate=08/01/2016&toDate=08/31/2016&ids [] = 1&amp; 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,或者我该怎么做才能将参数视为数组或集合?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

对于几年后问这个问题的人,由于它是google搜索结果的顶部,因此我遇到了同样的问题并得出以下结论:

如果在存储库方法中使用Collection类型作为参数,则使SD Rest正确转换的唯一方法是在注释状态上方的Rindra中,将值作为逗号分隔的字符串传递到单个查询参数中。它不会接受具有不同值的相同名称的多个参数。这是因为转换代码不够智能,无法知道所提供的集合(例如List)与预期的集合(例如List)不同,因为它不查看内部集合类型。它只是看到需要一个List并提供了List,因此它跳过了任何转换尝试。

也就是说,如果您改为使用数组(Integer [])而不是集合,则可以在单个查询参数中将值作为逗号分隔的字符串传递,而在多个查询参数中作为单个值传递。

它取决于转换服务中可用的已注册转换器。对于“?ids = 123,432”,有一个StringToCollectionConverter;对于“?ids = 123&ids = 432”,有一个CollectionToArrayConverter