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一组记录。所以如果你需要限制它 - 你可以用关键字 First
或 Top
来做到这一点:findTopBy...
, findFirstBy...
.
更多信息是 here。
事实证明,这一切都按预期工作。
如果您没有提供或提供了错误的搜索参数并且没有找到对象,则会出现 404 错误,因为找不到资源(搜索的对象)...
我将以下存储库公开为 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一组记录。所以如果你需要限制它 - 你可以用关键字 First
或 Top
来做到这一点:findTopBy...
, findFirstBy...
.
更多信息是 here。
事实证明,这一切都按预期工作。
如果您没有提供或提供了错误的搜索参数并且没有找到对象,则会出现 404 错误,因为找不到资源(搜索的对象)...