【问题标题】:Sprint Data Rest extend PagingAndSortingRepository with custom methodSprint Data Rest 使用自定义方法扩展 PagingAndSortingRepository
【发布时间】:2018-11-09 10:19:28
【问题描述】:

我的目标是在不创建自己的控制器的情况下向 Spring Data REST API 添加自定义便捷方法。

根据文档here,我已通过以下方式扩展PagingAndSortingRepository

存储库:

@RepositoryRestResource
public interface PartyRestRepository extends PagingAndSortingRepository<Party, String>, CustomPartyRestRepository {
}

与我的方法的接口:

public interface CustomPartyRestRepository {
    void dynamicPartyCreation(final String name);
}

实施:

public class CustomPartyRestRepositoryImpl implements CustomPartyRestRepository {
    @Autowired
    private PartyService partyService;

    @Autowired
    private PartyRepository partyRepository;

    @Autowired
    private HeroService heroService;


    @Override
    public void dynamicPartyCreation(final String name) {
        final Party party = this.partyService.createParty(name);
        final List<Hero> heroes = IntStream.range(0, 3)
                .mapToObj(i -> this.heroService.createHero(String.format("Hero %d for %s", i, name)))
                .collect(Collectors.toList());
        party.setMembers(heroes);
        this.partyRepository.save(party);
    }
}

当我执行GET localhost:8080/profile/parties/ 时,我看到 Spring 已经采用了我的方法并正在公开它:

  <...cut...>
  {
    "name": "dynamicPartyCreation",
    "type": "SAFE"
  }
   <..cut..>

但我似乎无法使用它。 GET localhost:8080/parties/dynamicPartyCreation/ 导致 404,POST 也是如此,有无正文,有无查询参数。 PUT 只是创建一个派对并忽略 url 的 /parties/dynamicPartyCreation/ 部分(意思是,我的方法没有被调用)。我已经尝试了一百万种组合,但我无法使用它。

我做错了什么?

【问题讨论】:

  • 您能否分享您的控制器详细信息,从您调用 localhost:8080/profile/parties/ 和 GET localhost:8080/parties/dynamicPartyCreation/
  • 这个是spring data rest提供的,我没有实现任何控制器
  • 这是一个非常奇怪的解决方案。您试图用这段代码解决的问题到底是什么?难道这不能通过 SDR 事件系统更轻松地处理吗? baeldung.com/spring-data-rest-eventsSpring 数据休息
  • 这是一个普通的旧 spring data rest api。为方便起见,应该公开额外的端点,这些端点可以一次性执行常见的操作序列。在本例中,创建一个附有四个英雄的队伍,从而将 9 个呼叫减少为一个)。

标签: spring-boot spring-data-rest


【解决方案1】:

嗯,很有趣,我从没想过它可以这样工作......

试试

return this.partyRepository.save(party);

虽然我根本不明白它是如何工作的,但当你基本上 @autowired PartyRepositoryCustom 进入它自己时......

所以也许它应该是这样的:

public class CustomPartyRestRepositoryImpl implements CustomPartyRestRepository {

@Autowired
private PartyService partyService;

@Autowired
private ListableBeanFactory beanFactory;

@Autowired
private HeroService heroService;


@Override
public Party dynamicPartyCreation(final String name) {
    final Party party = this.partyService.createParty(name);
    final List<Hero> heroes = IntStream.range(0, 3)
            .mapToObj(i -> this.heroService.createHero(String.format("Hero %d for %s", i, name)))
            .collect(Collectors.toList());
    party.setMembers(heroes);
    return beanFactory.getBean(PartyRepository.class).save(party);
}

}

如果服务器没有启动,请尝试通过 beanFactory 访问/初始化 PartyService 和 HeroService。

虽然它应该可以工作(我在当前项目中成功测试了类似的方法),但我仍然认为以这种方式实现它不是一个好主意。

  1. 这不是搜索(即使它返回一个新对象)
  2. 它改变了数据库,所以这个端点应该通过 PUT 方法访问。

所以我建议改为创建一个自定义控制器方法,并将逻辑移到 PartyService 类中。

哦,顺便说一句。您要查找的网址是

GET /parties/search/dynamicPartyCreation/

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2015-12-01
    • 2019-06-26
    • 1970-01-01
    • 2017-03-06
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多