@RepositoryEventHandler 事件以 @RepositoryRestController 停止

2023-11-24

当我创建一个@RepositoryRestController对于一个实体,关联的@RepositoryEventHandler方法不会通过 Spring Boot 1.4.0.M3(也包括 Spring Boot 1.3.5)在 Spring Data REST 中触发——这是一个 bug,还是按设计?

我有一个Account实体具有@RepositoryEventHandler:

@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。这真的是意图吗?


It's 已实施. :-)

中定义的方法@RepositoryRestController实现替换默认的方法存储库实体控制器哪个发布@RepositoryEventHandler events.

但添加这些事件很容易@RepositoryRestControll a 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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@RepositoryEventHandler 事件以 @RepositoryRestController 停止 的相关文章

随机推荐