向Spring RepositoryRestResource添加自定义方法

时间:2019-12-14 05:33:29

标签: java spring spring-data-rest

是否可以将自定义方法添加到Spring @RepositoryRestResource并将其公开为HTTP端点,如下面的示例尝试(但失败)?还是必须将自定义方法放在单独的@Controller中?

@RepositoryRestResource(path="person")
public interface PersonRepository extends CrudRepository<Person,Long> {

    // This works, as it's an integral part of what RepositoryRestResource does:
    // curl localhost:8080/person/search/findByNameStartsWith?prefix=MA
    Iterable<Person> findByNameStartsWith(@Param("prefix") String prefix);

    // This doesn't work:
    // curl -X POST -v localhost:8080/person/3/sendWelcomeLetter
    @RequestMapping(path = "/{id}/sendWelcomeLetter", method = RequestMethod.POST)
    default String sendWelcomeLetter(@PathVariable("id") Long id) {
        return "This is a custom method that would generate and send a letter.";
    }
}

3 个答案:

答案 0 :(得分:0)

sendWelcomeLetter不是ReST。 ReST中的ST表示“状态转移”,您的呼叫是动态的,没有状态转移。

最小的解决方案可能是添加一个新的可为空的列“ sent_welcome_newsletter”。

  • null表示欢迎新闻尚未发送。
  • false表示无法发送欢迎新闻(收件箱中完整或无效的电子邮件)。
  • true表示欢迎电子报过去已成功发送。

但是:注意legal right不会被DNSBL阻止。如果不遵守这一标准,您的公司将成为巨大的法律问题,这可能导致您失业!!!!

答案 1 :(得分:0)

请通过这个。 https://dzone.com/articles/add-custom-functionality-to-a-spring-data-reposito

你可以在类中使用@RestResource,如下所示

  @RepositoryRestResource(path = "people")
  interface PersonRepository extends CrudRepository<Person, Long> {

    @RestResource(path = "names")
    List<Person> findByName(String name);
 }

答案 2 :(得分:0)

您不能在存储库界面中执行 @RequestMapping 以使用您显示的默认方法映射端点。 根据文档

<块引用>

此存储库是一个接口,可让您执行涉及 Person 对象的各种操作。它通过扩展 Spring Data Commons 中定义的 PagingAndSortingRepository 接口来获取这些操作。

<块引用>

在运行时,Spring Data REST 会自动创建此接口的实现。然后它使用@RepositoryRestResource 注解来指导 Spring MVC 在 /people 创建 RESTful 端点。

要实现您想要执行的操作,您必须在新的 @RestController 中创建端点并使用服务,您应该使用 PersonRepository 获取此人,然后执行您的操作。