我只是为我的应用程序实现REST端点,我不确定哪种方法是最佳实践。
我这样得到我所有的实体
@GetMapping("/offers")
@Timed
public ResponseEntity<List<Offer>> getAllOffers(@ApiParam Pageable pageable)
throws URISyntaxException {
log.debug("REST request to get a page of Offers");
Page<Offer> page = offerService.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/offers");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
但是我应该怎么做,例如,如果我只想要带有某些特定projectId的商品。
@Query("FROM Offer o WHERE o.project.id = :projectId")
List<Offer> findAllByProject(@Param("projectId") Long projectId);
Q1此存储库调用的REST方法应如何?什么是正确的映射路径或参数插入。
Q2如果我想创建更复杂的查询该怎么办?例如,要根据地理位置,薪水等获得要约?
我知道我可以以某种方式做到这一点,但是我正在寻找一种干净的代码方式。我想保持代码的清洁,可扩展和可持续。首先,我想遵循REST的规则。
最佳答案
您可以注入您的存储库类型的Bean。 Spring会生成一个完全配置的代理实例,并将其放在上下文中。如果导出了存储库中定义的操作,则可以指定其路径:
@RepositoryRestResource(exported = true, path = "path-to-repository")
要设置操作的路径,可以在方法上放置
@RestResource
批注:@RestResource(exported = true, path = "operation")
默认情况下,
path-to-repository/search/operation
可用。使用
@Query
和JPQ语言编写自定义查询,或者使用本机SQL进行更详细的控制:@Query(value = "...", nativeQuery = true)
实际上,由于存储库的复杂性,某些操作很难用存储库来实现。它可能会滋生太大的默认方法,这些默认方法会处理一些存储库方法以产生所需的输出。
解决方案是创建一对控制器和服务,以“复制”并补充存储库的工作。幸运的是,Spring提供了一些方法来进行投影/排序/分页以及其他仓库可以直接使用的东西。