gpt4 book ai didi

spring - 以@EventListener 或@TransactionalEventListener 的方法保存数据

转载 作者:行者123 更新时间:2023-12-03 16:15:04 25 4
gpt4 key购买 nike

基于一篇文章,Better application events in Spring Framework 4.2 ,我设置了所有相关的类。我的大部分代码都可以正常工作,但在监听器的方法中出现异常。

Controller :

@PostMapping("/Foos")
public ResponseEntity<Foo> handle(@RequestBody Foo foo){
Optional<Foo> f = fooService.save(foo);
return f.isPresent() ? new ResponseEntity<>(f, HttpStatus.OK) :
new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}

服务:
@Transactional
public Optional<Foo> save(Foo foo){
foo = fooRepository.save(foo);
publisher.publishEvent(new FooEvent(foo));
return Optional.of(foo);
}

上面的方法没有@Transcational,下面的方法不会被触发。

聆听者
@Async
@TransactionalEventListener(condition ="#event.ok", phase = TransactionPhase.AFTER_COMMIT)
public void handle(FooEvent event){
Product product = new Product(event.getData());
productService.save(product);
}

产品服务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Optional<Product> save(Product product){
product = productRepository.save(product);
return Optional.of(product);
}

尽管调用了监听器方法,但根本不会保存 Product 数据。代码在 Spring Boot 应用程序中运行 BTW。我还没有在网上找到任何相关信息。如何解决这个问题呢?

最佳答案

根据您要实现的目标,解决方案可能会有所不同:

  • 如果您想在范围内保存产品现有 交易(您发布事件的地方)然后只需将阶段更改为 TransactionPhase.BEFORE_COMMIT你应该很好。
  • 如果您想在 内保存产品新品 紧接在前一个之后的独立事务然后添加 @Transactional(propagation = Propagation.REQUIRES_NEW)到您的 handle 方法,并保留其他所有内容。
  • 关于spring - 以@EventListener 或@TransactionalEventListener 的方法保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44752567/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com