Sprint Data Rest使用自定义方法扩展了PagingAndSortingRepository

时间:2018-11-09 10:19:28

标签: spring-boot spring-data-rest

我的目标是在不创建自己的控制器的情况下向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/和POST一样,无论正文还是不正文,是否具有查询参数,都会产生404。 PUT只是创建一个聚会,而忽略URL的/parties/dynamicPartyCreation/部分(这意味着未调用我的方法)。我已经尝试了上百万种组合,但无法使用。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

好吧,有趣,我从没想过它可以这样...

尝试

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/