【发布时间】:2014-10-03 04:33:36
【问题描述】:
我正在尝试在 spring bean 中执行以下操作:
@PostConstruct
public void registerTorchEntityListeners()
{
Session session = entityManager.unwrap(Session.class);
for (EntityType<?> entity : entityManager.getMetamodel().getEntities())
{
if (entity.getJavaType().isAnnotationPresent(TorchEntityListeners.class))
{
TorchEntityListeners annotation = (TorchEntityListeners) entity.getJavaType().getAnnotation(TorchEntityListeners.class);
for (Class listenerClass : annotation.value())
{
Map<String, DescriptorEventListener> map = applicationContext.getBeansOfType(listenerClass);
for (DescriptorEventListener listenerBean : map.values())
{
session.getClassDescriptor(entity.getClass()).getEventManager().addListener(listenerBean);
}
}
}
}
}
问题是我得到以下异常,因为(我认为)我不在事务中,因此没有可用于获取 ClassDescriptor 的会话,以便我可以将侦听器添加到特定实体:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'torchEntityListenerConfigurer': Invocation of init method failed; nested exception is java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396)
基本上我正在尝试做与此等效的 EclipseLink:http://invariantproperties.com/2013/09/29/spring-injected-beans-in-jpa-entitylisteners/。我宁愿用监听器来注释实体,而不是做这样的事情:Injecting a Spring dependency into a JPA EntityListener。
想法?
【问题讨论】:
-
你目前如何在你的 bean 中注入
EntityManager? -
它与:@PersistenceContext 是我的问题......是的,我知道我没有展示那部分......但我没有意识到这是这个问题。
标签: spring eclipselink jpa-2.0