2013-04-21 2 views
0

Я пытаюсь использовать @Configurable, чтобы ввести весенний боб в @PostPersist прослушиватель.Использование @Configurable для инжекции весеннего боба в JPA сущности-слушателя

@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 всегда нуль.

Что мне не хватает?

ответ

0

Ok, BankAccountAuditListener создан Hibernate ПЕРЕД ПРИМЕНЕНИЕМ ApplicationContext of spring готов к использованию. Возможно, именно по этой причине я не могу ничего там вводить.

+0

ли вы изменили javaagent весеннему/AspectJ один? – lbednaszynski

+0

@marchewa, Как я помню, я это сделал. Но после нескольких итераций я отказался от подхода AspectJ. –

0

Вы можете использовать лениво инициализированный компонент внутри вашего класса JPAEventListener, который инициализируется, когда объект первого времени сохраняется.

Затем используйте @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); 
}} 

И ваш ленивый загружен класс боб

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

    @Autowired 
    private Environment environment; 

    public void onEntityPrePersist(TransactionalEntity entity) { 

     //custom logic 
    }