記事に基づいて、Better application events in Spring Framework 4.2に基づいて、関連するすべてのクラスを設定します。私のコードのほとんどは、リスナーのメソッドで例外を指定して、必要に応じて動作します。@EventListenerまたは@TransactionalEventListenerのメソッドでデータを保存する
コントローラ:
@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);
}
サービス:上記の方法で@Transcationalなし
@Transactional
public Optional<Foo> save(Foo foo){
foo = fooRepository.save(foo);
publisher.publishEvent(new FooEvent(foo));
return Optional.of(foo);
}
、以下の方法がトリガされないであろう。
リスナー
@Async
@TransactionalEventListener(condition ="#event.ok", phase = TransactionPhase.AFTER_COMMIT)
public void handle(FooEvent event){
Product product = new Product(event.getData());
productService.save(product);
}
ProductService
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Optional<Product> save(Product product){
product = productRepository.save(product);
return Optional.of(product);
}
製品データは、リスナーメソッドが呼び出されたすべてがに保存されていません。このコードは、Spring Boot app BTWで実行されます。関連する情報はまだオンラインで見つかりませんでした。この問題を解決するには?
このメソッドがトリガーされていることを確認しましたか?間違った方法でトランスレーションを設定した場合は、 – xyz
メソッドが呼び出されません。私はこのメソッドでprintlnを持っています。 – vic
保存のためのトランザクション伝播レベルは何ですか? AFTER_COMMITは必要なものですか?なぜBEFORE_COMMITしないのですか? – xyz