我只是为我的应用程序实现 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 提供了制作投影/排序/分页的方法以及存储库开箱即用的其他内容。
我看到您正在使用我从未使用过的招摇注释(@ApiParam(,但是在 Spring 中,如果您还没有这样做,请用 @RestController 标记您的控制器。
@RestController
public class OfferRestController {
.....
你可以像这样定义你的端点 - 如果你使用的是 Spring 引导,并且你的类路径上有 jackson,它将为你处理序列化;
@GetMapping(value="/offers")
public List<Offer> getAllOffers() {
return offerService.findAll(pageable);
}
@GetMapping(value="/offers/{location})
public List<Offer> getAllOffers(@PathVariable("location") String location) {
return offerService.findByLocation(location);
}
很高兴您了解 JPA 存储库,您见过 Spring RestRepository 吗?它们会自动通过 REST 公开您的查询
interface OfferRepository extends CrudRepository<Offer,Long> {
List<Offer> findByLocation (final String location)
}
会公开这样的端点;
http://localhost:8080/offers/search/findByLocation?location=London
您将需要 Spring 引导启动器、spring-boot-starter-data-jpa、spring-boot-starter-data-rest 和 spring-data-rest-hal-browser 将允许您通过浏览器浏览 REST 存储库(Spring 入门指南(。
我没有足够的勇气提供一个示例(!(,但是为了构建更高级的查询,您可以通过查询规范提供自定义实现
[编辑]
主要是我想遵循 REST 的规则。
您还有像@GetMapping一样工作的@PostMapping、@DeleteMapping@PutMapping并映射到相应的 HTTP 动词; 你会像这样发布;
@PostMapping ("/offers")
public void postSomething (@RequestBody Offer offer) {
offerService.save (offer);
}
使用 spring data jpa,您可以使用查询方法来编写相当复杂的查询。参考这里。