2017-09-11 19 views
0

springのように見えるサービスクラスの@Transactionalアノテーションは無視されます。 私はいくつかのq&a on SOblogsを読んだが、どれも私にとってはうまくいかないようだ。Springは@Transactionalアノテーションを無視します

  1. 私はプライベートメソッドを呼び出していないよ - 私は、インターフェイス上で公開されパブリックメソッドを呼び出します。
  2. 私は別のクラスのメソッドを呼び出しています(つまり、同じクラスから呼び出していない)。
  3. 私の「サービス」クラスには、@Component@Transactionalと注釈が付けられています。 。
  4. 私の「サービスクラスがインタフェースを持っている、と私はインターフェイス、および@Inject注釈を使用して、それを注入してい
  5. 答えの一つに、ここで説明したように私はproxy-target-class="true"を追加しようとした - 。動作しませんでした
  6. I 。私はこの例外を取得するときに「(スプリングMVCではない)JAX-RSを用いたM

エラーが@Transactional(propagation = Propagation.MANDATORY)で注釈DAO層、で発生:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' 

以下に、関連するクラスとインタフェースを表す一般的なコードを示します。

public interface IService<T extends BaseEntity> { 
    void save(T entity); 
} 

public abstract class AbstractService<T extends BaseEntity> implements IService<T> { 

    @Inject 
    private IDao dao; 

    @Override 
    public void save(T entity) { 
     dao.save(entity); 
    } 
} 

public interface IPersonService extends IService<PersonEntity> { 
     void saveAll(List<PersonEntity> persons); 
} 

@Component 
@Transactional 
public class PersonService extends AbstractService<PersonEntity> implements IPersonService { 

    @Override 
    public void saveAll(List<PersonEntity> persons) { 
     for (PersonEntity person : persons) { 
      super.save(person); 
     } 
    } 
} 

@Component 
public class PersonApi { 

    @Inject 
    private IPersonService personService; 

    public void saveAll(...) { 
     ... 
     personService.saveAll(persons); 
    } 
} 

アイデアや提案はありますか?

+2

同じクラスのメソッドを呼び出す場合は、このようなことはありません。 AOPは、内部メソッド呼び出しではなく、外部メソッド呼び出しに対してのみ機能します。ただし、コードを追加していないので、エラーがどこにあるかはわかりません。 –

+0

あなたはそれが機能しないと思いますか?いくつかのコードを共有できますか? – Leffchik

+0

私は同じクラスのメソッドを呼び出していません。私が言ったように、私はそれのインターフェイスを使用してサービスを注入している、私はインターフェイスを使用して呼び出す。 いくつかのコードサンプルを提供しています... –

答えて

0

@Transactionalも抽象クラスに注釈を付ける必要があります。それ以外の場合は動作しません。 Springのドキュメントでは、インターフェイスについてのみ説明しています。 ここで抽象クラスメソッドを呼び出すので、@ Transactionalである必要もあります。

@Transactional 
public abstract class AbstractService<T extends BaseEntity> implements IService<T> { 

    @Inject 
    private IDao dao; 

    @Override 
    public void save(T entity) { 
     dao.save(entity); 
    } 


} 
関連する問題