2017-06-26 1 views
1

記事に基づいて、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で実行されます。関連する情報はまだオンラインで見つかりませんでした。この問題を解決するには?

+0

このメソッドがトリガーされていることを確認しましたか?間違った方法でトランスレーションを設定した場合は、 – xyz

+0

メソッドが呼び出されません。私はこのメソッドでprintlnを持っています。 – vic

+0

保存のためのトランザクション伝播レベルは何ですか? AFTER_COMMITは必要なものですか?なぜBEFORE_COMMITしないのですか? – xyz

答えて

2

ソリューションは、あなたが達成したいかに応じて、異なる場合があります:

  1. あなたは(あなたがイベントを公表)既存トランザクションの範囲内で製品を保存したい場合は、単に位相を変化しますTransactionPhase.BEFORE_COMMITとあなたは良いはずです。

  2. はあなただけで、以前の1の後に新しい独立したトランザクション内で製品を保存する場合は、あなたのhandleメソッドに@Transactional(propagation = Propagation.REQUIRES_NEW)を追加しているとして、他のすべてを残しました。

+0

に回答しています。ありがとう。 – vic

関連する問題