spring 剩余存储库资源 return 搜索中的单个对象

spring rest repository resource return single object in search

我将以下存储库公开为 restapi:

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

当我转到 orders/search 时,我得到了预期的结果:

{
"_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 查询 link 有效。未找到 findOneByOrderNumber 查询 link returns 404。当我将 returned 单曲 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!

我尝试了各种不同的查询名称,但这似乎不是问题所在。问题出在存储库剩余资源映射上。

我试过 return Optional<Order>Resource<Order> 但都没有用。

根据文档 here,您不需要(也许不应该)在方法签名中写入 "One"。你能试试方法签名吗?

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

您需要执行以下操作才能从查询结果中获取单个(第一个)元素:

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

find..By..return一组记录。所以如果你需要限制它 - 你可以用关键字 FirstTop 来做到这一点:findTopBy..., findFirstBy....

更多信息是 here

事实证明,这一切都按预期工作。

如果您没有提供或提供了错误的搜索参数并且没有找到对象,则会出现 404 错误,因为找不到资源(搜索的对象)...