![](/img/trans.png)
[英]PersistenceContext and EntityManager nullPointerException
[英]NullPointerException for EntityManager using @PersistenceContext
我正在尝试创建一个具有EntityManager
的审核服务。 但是,此EntityManager
在运行应用程序时从未初始化,因此在调用它时会抛出NullPointerException
。
我的代码如下所示:
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Service
public class AuditServiceImpl implements AuditService {
private static final String FULL_NAME = "%s %s";
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager(){
return entityManager;
}
}
我希望@PersistenceContext
批注会为我解决此问题,但并没有解决。 我还看到了其他有关类似问题的文章,但是大多数解决方案似乎都已过时,因此我决定创建另一篇文章。
任何人都可以阐明这个问题,甚至可以找到解决方案吗?
首先,请确保正确设置了EntityManagerFactory和持久性单元。 一个简单的XML样式如下所示:
<context:component-scan base-package="..." />
<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="yourPersistenceUnit" />
</bean>
但是从下面的注释中可以看出,问题似乎是如何引用AuditServiceImpl的。 基本上,使用AuditService的客户端应该从Spring IoC容器获取引用,而不是实例化对象本身。 它可以通过多种方式完成,例如,如果您通过XML样式在独立应用程序中实例化容器,则可以使用ApplicationContext:
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"yourApplicationContext.xml"});
AuditService auditService = context.getBean("auditService", AuditService.class);
auditService.doSomething();
如果您使用的是Spring MVC,或者将服务注入Web层的客户端。
@Controller
public class MyController {
@Autowired
AuditService auditService;
public void foo() {
auditService.doSomething();
}
}
在代码中注入EntityManagerFactory而不是注入EntityManager
请看下面:
@PersistenceUnit(unitName = "persistanceUnitName") private EntityManagerFactory entityManagerFactory;
然后为了获取EntityManager,请执行以下代码:
public EntityManager getEntityManager(){ return entityManagerFactory.createEntityManager(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.