当我@RepositoryRestController为实体创建时,@RepositoryEventHandler在Spring Data REST中不会通过Spring Boot 1.4.0.M3(也是Spring Boot 1.3.5)触发关联的方法-这是Bug还是 设计 错误?
@RepositoryRestController
@RepositoryEventHandler
我有一个具有的Account实体@RepositoryEventHandler:
Account
@Slf4j @Component @RepositoryEventHandler(Account.class) public class AccountEventBridge { @HandleBeforeCreate public void handleBeforeCreate(Account account){ log.info("Before create " + account); } @HandleAfterCreate public void handleAfterCreate(Account account){ log.info("Created " + account); } }
在我发布时应触发:
curl -H "Content-Type: application/json" -X POST -d '{"name":"aaa", "owner":{"email":"aaa@1010","password":"snap"}}' http://localhost:8080/api/accounts
除非我添加@RepositoryRestController:
@RepositoryRestController public class AccountRespositoryRestController { private final AccountRepository repository; @Autowired public AccountRespositoryRestController(AccountRepository repository) { this.repository = repository; } @RequestMapping(method = RequestMethod.POST,value = "/accounts") public @ResponseBody PersistentEntityResource post( @RequestBody Account account, PersistentEntityResourceAssembler assembler) { // ... Account entity = this.repository.save(account); return assembler.toResource(entity); } }
当我注释掉@RepositoryRestController注释时,@RepositoryEventHandler方法再次触发。
由于它们在Spring Data REST中运行两个不同的概念层,因此它们似乎应该独立运行-还是我误会了什么?
如果这是故意的,那么很不幸- 我将必须实现所有HTTP方法,以便使用自己为任何实体创建事件@RepositoryRestController。这真的是目的吗?
它 已实现 。:-)
在@RepositoryRestController实现中定义的方法替换了发布事件的默认RepositoryEntityController中的方法@RepositoryEventHandler。
但是添加这些事件使其@RepositoryRestControll成为ApplicationEventPublisherAware实现并像默认RepositoryEntityController实现一样发布事件很容易:
@RepositoryRestControll
ApplicationEventPublisherAware
RepositoryEntityController
@Slf4j @RepositoryRestController @AllArgConstructor public class AccountRespositoryRestController implements ApplicationEventPublisherAware { private final AccountRepository repository; private ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher( ApplicationEventPublisher publisher) { this.publisher = publisher; } @RequestMapping(method = RequestMethod.POST,value = "/accounts") public @ResponseBody PersistentEntityResource post( @RequestBody Account account, PersistentEntityResourceAssembler assembler) { // ... publisher.publishEvent(new BeforeCreateEvent(account)); Account entity = this.repository.save(account); publisher.publishEvent(new AfterCreateEvent(entity)); return assembler.toResource(entity); } }
您也可以在不上课的情况下注入发布者ApplicationEventPublisherAware:
@Slf4j @RepositoryRestController @AllArgConstructor public class AccountRespositoryRestController { private final AccountRepository repository; private final ApplicationEventPublisher publisher; @RequestMapping(method = RequestMethod.POST,value = "/accounts") public @ResponseBody PersistentEntityResource post( @RequestBody Account account, PersistentEntityResourceAssembler assembler) { // ... publisher.publishEvent(new BeforeCreateEvent(account)); Account entity = this.repository.save(account); publisher.publishEvent(new AfterCreateEvent(entity)); return assembler.toResource(entity); } }