spring rest repository资源返回搜索中的单个对象

时间:2017-05-03 08:14:38

标签: spring-boot spring-data-mongodb spring-data-rest

我将以下存储库公开为rest api:

@RepositoryRestResource(excerptProjection = OrderSummary.class)
public interface OrderRepository extends MongoRepository<Order, Integer>
{
    List<Order> findByOrderNumber(@Param("orderNumber") String orderNumber);
    Order findOneByOrderNumber(@Param("orderNumber") String orderNumber);
}

当我去订单/搜索时,我得到了预期的结果:

{
"_links" : {
    "findByOrderNumber" : {
      "href" : "http://localhost:12345/api/orders/search/findByOrderNumber{?orderNumber,projection}",
      "templated" : true
    },
    "findOneByOrderNumber" : {
      "href" : "http://localhost:12345/api/orders/search/findOneByOrderNumber{?orderNumber,projection}",
      "templated" : true
    },
    "self" : {
      "href" : "http://localhost:12345/api/orders/search"
    }
  }
}

但是,只有findByOrderNumber查询链接有效。 findOneByOrderNumber查询链接返回404未找到。当我将返回的单个Order更改为List<Order>时,它可以正常工作。

如果我从代码repository.findOneByOrderNumber()运行查询,它也会按预期工作。

如何才能使其适用于存储库休息资源?

编辑:

通过一些调试日志记录,我可以找到以下调试日志:

Resolving exception from handler [public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositorySearchController.executeSearch(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.util.MultiValueMap<java.lang.String, java.lang.Object>,java.lang.String,org.springframework.data.rest.webmvc.support.DefaultedPageable,org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,org.springframework.http.HttpHeaders)]: org.springframework.data.rest.webmvc.ResourceNotFoundException: Resource not found!

我尝试过各种不同的查询名称,但这似乎不是问题所在。问题在于存储库休息资源映射。

我试图返回Optional<Order>Resource<Order>,但都没有效果。

3 个答案:

答案 0 :(得分:1)

您需要以下命令从查询结果中获取单个(第一个)元素:

Order findFirstByOrderNumber(@Param("orderNumber") String orderNumber);

find..By..返回一组记录。因此,如果您需要限制它 - 您可以使用关键字FirstTop执行此操作:findTopBy...findFirstBy...

更多信息是here

答案 1 :(得分:1)

事实证明,这只是按预期工作。

如果您没有提供或提供错误的搜索参数且未找到任何对象,则会显示404错误,因为找不到资源(搜索到的对象)...

答案 2 :(得分:0)

根据文件here,你不需要(也许不应该)写一个&#34; One&#34;在方法签名中。你可以试试方法签名吗?

Order findByOrderNumber(@Param("orderNumber") String orderNumber);