有人可以帮我吗?实际上,我有一个使用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,或者我该怎么做才能将参数视为数组或集合?
提前谢谢。
答案 0 :(得分:2)
对于几年后问这个问题的人,由于它是google搜索结果的顶部,因此我遇到了同样的问题并得出以下结论:
如果在存储库方法中使用Collection类型作为参数,则使SD Rest正确转换的唯一方法是在注释状态上方的Rindra中,将值作为逗号分隔的字符串传递到单个查询参数中。它不会接受具有不同值的相同名称的多个参数。这是因为转换代码不够智能,无法知道所提供的集合(例如List)与预期的集合(例如List)不同,因为它不查看内部集合类型。它只是看到需要一个List并提供了List,因此它跳过了任何转换尝试。
也就是说,如果您改为使用数组(Integer [])而不是集合,则可以在单个查询参数中将值作为逗号分隔的字符串传递,而在多个查询参数中作为单个值传递。
它取决于转换服务中可用的已注册转换器。对于“?ids = 123,432”,有一个StringToCollectionConverter;对于“?ids = 123&ids = 432”,有一个CollectionToArrayConverter