我将以下存储库公开为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>
,但都没有效果。
答案 0 :(得分:1)
您需要以下命令从查询结果中获取单个(第一个)元素:
Order findFirstByOrderNumber(@Param("orderNumber") String orderNumber);
find..By..
返回一组记录。因此,如果您需要限制它 - 您可以使用关键字First
或Top
执行此操作:findTopBy...
,findFirstBy...
。
更多信息是here。
答案 1 :(得分:1)
事实证明,这只是按预期工作。
如果您没有提供或提供错误的搜索参数且未找到任何对象,则会显示404错误,因为找不到资源(搜索到的对象)...
答案 2 :(得分:0)
根据文件here,你不需要(也许不应该)写一个&#34; One&#34;在方法签名中。你可以试试方法签名吗?
Order findByOrderNumber(@Param("orderNumber") String orderNumber);