我正在尝试创建一个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
注释会为我解决这个问题,但事实并非如此。我看到其他一些关于类似问题的帖子,但大多数解决方案似乎已经过时了,所以我决定创建另一篇文章。
任何人都可以对这个问题有所了解,甚至可能是一个解决方案吗?
答案 0 :(得分:0)
首先,请确保正确设置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();
}
}
答案 1 :(得分:-1)
不是注入EntityManager,而是在代码中注入EntityManagerFactory
请参阅以下内容:
@PersistenceUnit(unitName = "persistanceUnitName")
private EntityManagerFactory entityManagerFactory;
然后获取EntityManager,请执行以下代码:
public EntityManager getEntityManager(){
return entityManagerFactory.createEntityManager();
}