我的目标是在不创建自己的控制器的情况下向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/
部分(这意味着未调用我的方法)。我已经尝试了上百万种组合,但无法使用。
我在做什么错了?
答案 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。
尽管它可以工作(我在当前项目中成功测试了类似的方法),但我仍然认为以这种方式实现它不是一个好主意。
因此,我建议改为创建一个自定义控制器方法,并将逻辑移到PartyService类中。
哦,顺便说一句。您正在寻找的网址是
GET /parties/search/dynamicPartyCreation/