0

リスナー@ConfigurableにSpring Beanを注入するために使用しようとしています。@PostPersist

@Configurable
@EnableSpringConfigured
public class BankAccountAuditListener {

@PersistenceContext
private EntityManager em;

@PostPersist
public void createAudit(BankAccount bankAccount){
    ...
}
}

リスナーの呼び出し元@EntityListeners({BankAccountAuditListener.class})

これを春の設定xmlファイルに入れました:

<context:annotation-config/>
<context:spring-configured/>
<context:load-time-weaver/>

createAudit(...)関数では、em常に null です。

私は何が欠けていますか?

4

2 に答える 2

0

JPAEventListener クラス内で遅延初期化された Bean を使用できます。これは、エンティティが最初に永続化されるときに初期化されます。

次に、遅延ロードされた Bean で @Configurable を使用します。最善の解決策ではないかもしれませんが、簡単な回避策です

 public class JPAEntityListener{

/**
* Hibernate JPA  EntityListEner is not spring managed and gets created via reflection by hibernate library while entitymanager is loaded.
* Inorder to inject business rules via Spring use lazy loaded bean  which makes use of   @Configurable 
 */
private CustomEntityListener listener;

public JPAEntityListener() {
    super();
}

@PrePersist
public void onEntityPrePersist(TransactionalEntity entity) {
    if (listener == null) {
        listener = new CustomEntityListener();
    }
    listener.onEntityPrePersist(entity);

}

@PreUpdate
public void onEntityPreUpdate(TransactionalEntity entity) {
    if (listener == null) {
        listener = new CustomEntityListener();
    }
    listener.onEntityPreUpdate(entity);
}}

そして、遅延ロードされた Bean クラス

 @Configurable(autowire = Autowire.BY_TYPE)
    public class CustomEntityListener{

    @Autowired
    private Environment environment;

    public void onEntityPrePersist(TransactionalEntity entity) {

        //custom logic
    }
于 2014-03-08T05:17:47.380 に答える