我只是为我的应用程序实现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提供了一些方法来进行投影/排序/分页以及其他仓库可以直接使用的东西。

07-24 18:41
查看更多