繁体   English   中英

使用@PersistenceContext的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM