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

问题描述 投票:1回答:1

有人可以帮我吗?实际上,我有一个使用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,或者应如何使它将该参数视为数组或集合?

先谢谢您。

spring spring-mvc spring-boot spring-data-jpa spring-data-rest
1个回答
0
投票

对于几年后收到此答复的人,因为它是google搜索结果的顶部,所以我遇到了同样的问题,并发现了以下内容:

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

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

归结为转换服务中可用的注册转换器。如果是“?ids = 123,432”,则有一个StringToCollectionConverter,如果是“?ids = 123&ids = 432”,则有一个CollectionToArrayConverter。

© www.soinside.com 2019 - 2024. All rights reserved.