【问题标题】:The way of passing complex params into spring date rest's methodspring date rest的方法中传递复杂参数的方式
【发布时间】:2015-04-27 13:36:27
【问题描述】:

我正在尝试查找有关以下问题的任何信息: 我有一个 JPA 存储库,它通过 Spring Data Rest 项目向 REST 服务公开:

Page<Business> findByUser(@Param("user") User user, Pageable pageable);

其中user 参数是实体。

现在,当我尝试从客户端(使用 RestTemplate 或 Traverson)调用此 REST 方法时,我不明白应该如何传递此参数...

不制作自定义控制器是否可以实现?

提前谢谢你

【问题讨论】:

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


    【解决方案1】:

    我假设User 是另一个 Spring Data REST 托管实体?如果是这样,您将标识您希望将方法交给查询方法资源的用户的 URI。

    Traverson traverson = new Traverson(…);
    traverson.follow("businesses", "search", "findByUser")
      .withTemplateParameters(Collections.singletonMap("user", "…/users/4711")).…
    

    【讨论】:

    • 一旦我使用你建议的rest call的格式就会失败:Failed to convert from type java.lang.String to type java.lang.Long for value '.../users/4'; nested exception is java.lang.NumberFormatException: For input string: ".../users/4"
    • 我有同样的问题(不是使用 Traverson,而是直接访问我的服务器 API)。所以我做了一点调试,我观察了org.springframework.data.repository.support.DomainClassConverter 中的内容。在里面,info.metadata.idTypeLong(这很正常,我的@Id 是长的),而 source 是 URI 字符串。所以它尝试调用一个字符串-> 长转换器。这引发了异常。我想它不是打算到这里的,但我无法理解路上出了什么问题……
    • 因此,如果我使用 DB id 而不是 URI,它确实有效。但我认为这不是为了操纵它们。
    • 顺便说一句,我在org.springframework.data.rest.core.UriToEntityConverter 中设置了一个断点,但它从未命中。那么这个转换器的注册可能有问题吗?
    【解决方案2】:

    我终于明白了。查看 Spring JIRA 上的 this issue

    请求这个的方式取决于你的 Spring Data Rest 版本。如果您有 2.4+ 版本,则必须使用 URI。如果您有旧版本,则必须使用主键。

    因此,如果您使用的是旧版本的 SDR,您可能需要公开您的主键。 This question 可以帮助您管理。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 2016-08-07
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多