当前位置: 首页 > 面试题库 >

@RepositoryEventHandler事件以@RepositoryRestController停止

邓光耀
2023-03-14
问题内容

当我@RepositoryRestController为实体创建时,@RepositoryEventHandler在Spring Data
REST中不会通过Spring Boot 1.4.0.M3(也是Spring Boot 1.3.5)触发关联的方法-这是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。这真的是目的吗?


问题答案:

已实现 。:-)

@RepositoryRestController实现中定义的方法替换了发布事件的默认RepositoryEntityController中的方法@RepositoryEventHandler

但是添加这些事件使其@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);
    }
}


 类似资料:
  • 我正在尝试处理用户的Backspace按键。我有2个处理程序绑定到一个输入元素。由于无法在onChange事件处理程序中检测按键,因此我必须在onKeyDown中进行。我想在按下backspace时停止onChange事件的传播(并在onKeyDown事件处理程序中处理)。有什么想法如何实现这一点?谢谢!

  • ap.onBackgroundAudioStop(CALLBACK) 监听音乐停止事件。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width: 1

  • 是否有任何方法可以暂停EventBus从guava库发布的事件。 我有一个发布事件的方法(例如,SomethingChangedEvent)。现在,这个方法在循环中被另一个方法调用。问题是,每次调用时都会发布,即使只有最后一次更改才重要。由于事件的处理程序执行一些重计算,因此应用程序的性能会快速下降。 最后一次执行后,我想告诉guava恢复事件处理。 有没有办法告诉番石榴,除了最后一个,不要理会所

  • 问题内容: 当用户滚动页面时,我想做一些有趣的jQuery东西。但是我不知道如何解决这个问题,因为只有方法。 有任何想法吗? 问题答案: 您可以使每次用户滚动时都有一个超时被覆盖。这样,当他在一定毫秒后停止运行时,您的脚本将运行,但是如果他在此期间滚动,则计数器将重新开始,并且脚本将等待直到完成滚动为止。 更新: 因为这个问题又采取了一些行动,所以我认为我不妨使用添加事件的jQuery扩展对其进行

  • 问题内容: 是否有一种内置的方法来阻止事件进入作用域链? 由事件传递的事件对象没有方法(如$ rootScope上 的文档所述。)但是,此合并的pull请求表明事件可以对其进行调用。 问题答案: 来自angularJS 1.1.2源代码的片段: 如您所见,$ broadcast中的事件对象没有“ stopPropagation”。 可以使用preventDefault代替stopPropagati

  • 我试图在JavaFX中重现一个JavaScript游戏的一些行为。该程序有几个数字文本字段,可以在游戏运行时进行编辑。它在运行时也接受字母键盘命令。 macOS、Java17、JavaFX17。