Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 如何在非EJB@Dependent子类中获得CDI生成的entitymanager,抛出NPE?_Jpa_Ejb_Openjpa_Websphere 8_Jta - Fatal编程技术网

Jpa 如何在非EJB@Dependent子类中获得CDI生成的entitymanager,抛出NPE?

Jpa 如何在非EJB@Dependent子类中获得CDI生成的entitymanager,抛出NPE?,jpa,ejb,openjpa,websphere-8,jta,Jpa,Ejb,Openjpa,Websphere 8,Jta,持久性API使用JTA管理的事务,该事务在persistence.xml中配置 EntitymanagerProducer.java @PersistenceContext( unitName = "PRO" ) EntityManager proEm; @pro @Produces public EntityManager createProEntityManager () { return this.proEm; } @Dependent public class OutRepo

持久性API使用JTA管理的事务,该事务在
persistence.xml
中配置

EntitymanagerProducer.java

@PersistenceContext( unitName = "PRO" )
EntityManager proEm;

@pro
@Produces
public EntityManager createProEntityManager () {
    return this.proEm;
}
@Dependent
public class OutRepository extends BaseService< Out, Long > {


public OutRepository() {
    // TODO Auto-generated constructor stub
}


@Override
protected Class< Out > t () {
    return Out.class;
}
public List< Out > getOuts ( Long proId, String Out) { 
    CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); <= NPE
    CriteriaQuery< Out > criteriaQuery = builder.createQuery( t() );
    Root< Out > endPointConfig = criteriaQuery.from( t() );
    criteriaQuery.select( endPoint ); 
    TypedQuery< Out > query = this.entityManager.createQuery( criteriaQuery );
    return query.getResultList();
}
@Dependent
public abstract class BaseService< T, I extends Serializable > implements BaseEntity< T, I > {


    protected abstract Class< T > t ();

    @PostConstruct
    protected abstract void init ();

    public PersistenceUnitUtil persistenceUnitUtil;
    public EntityManager       entityManager;


    @TransactionAttribute( TransactionAttributeType.MANDATORY )
    @Override
    public T save ( T t ) {
        this.entityManager.persist( t ); 
        return t;
    }
上面生成的
EntityManager
可以注入任何
@Stateless
bean,使用限定符
@Pro
,如下所示

@Stateless
@Local( OutRepositoryBeanLocal.class )
@Remote( OutRepositoryRemote.class )
@LocalBean
@TransactionAttribute( TransactionAttributeType.MANDATORY )
public class OutRepositoryBean implements OutRepositoryBeanLocal, OutRepositoryRemote {

    @Inject
    @Pro
    private EntityManager entityManager;

    @Inject
    OutRepository      outRepository;

    /**
     * 
     */
    @PostConstruct
    private void init () {
        this.outRepository.setEntityManager( this.entityManager );
    }
上面这段代码毫无差错地工作。但是,当将作业委托给依赖的子类时,会出现问题

OutRepository.java

@PersistenceContext( unitName = "PRO" )
EntityManager proEm;

@pro
@Produces
public EntityManager createProEntityManager () {
    return this.proEm;
}
@Dependent
public class OutRepository extends BaseService< Out, Long > {


public OutRepository() {
    // TODO Auto-generated constructor stub
}


@Override
protected Class< Out > t () {
    return Out.class;
}
public List< Out > getOuts ( Long proId, String Out) { 
    CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); <= NPE
    CriteriaQuery< Out > criteriaQuery = builder.createQuery( t() );
    Root< Out > endPointConfig = criteriaQuery.from( t() );
    criteriaQuery.select( endPoint ); 
    TypedQuery< Out > query = this.entityManager.createQuery( criteriaQuery );
    return query.getResultList();
}
@Dependent
public abstract class BaseService< T, I extends Serializable > implements BaseEntity< T, I > {


    protected abstract Class< T > t ();

    @PostConstruct
    protected abstract void init ();

    public PersistenceUnitUtil persistenceUnitUtil;
    public EntityManager       entityManager;


    @TransactionAttribute( TransactionAttributeType.MANDATORY )
    @Override
    public T save ( T t ) {
        this.entityManager.persist( t ); 
        return t;
    }
调用
outRepsitory.save()
时,事务中没有问题,一切正常。然而,当
outRepository.getout(Long proId,String Out)
时,会发生以下异常

[2/7/18 18:19:36:187 IST] 0000003d BusinessExcep E   CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "getOuts" on bean "BeanId(pro-ear#pro-web-0.0.1-SNAPSHOT.war#OutRepositoryBean, null)". Exception data: java.lang.NullPointerException
    at org.apache.openjpa.persistence.meta.MetamodelImpl.populate(MetamodelImpl.java:321)
    at org.apache.openjpa.persistence.meta.MetamodelImpl.instantiate(MetamodelImpl.java:255)
    at org.apache.openjpa.persistence.meta.MetamodelImpl.find(MetamodelImpl.java:224)
    at org.apache.openjpa.persistence.meta.MetamodelImpl.<init>(MetamodelImpl.java:89)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:346)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.getCriteriaBuilder(EntityManagerFactoryImpl.java:333)
    at org.apache.openjpa.persistence.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:1649)
    at org.apache.openjpa.persistence.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:101)
    at com.ibm.ws.jpa.management.JPAExEmInvocation.getCriteriaBuilder(JPAExEmInvocation.java:394)
    at com.ibm.ws.jpa.management.JPAEntityManager.getCriteriaBuilder(JPAEntityManager.java:494)
    at com.org.uck.pro.db.out.control.OutRepository.getOuts(OutRepository.java:68)
    at com.org.uck.pro.db.out.control.OutRepositoryBean.getOuts(OutRepositoryBean.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.ibm.ejs.container.EJSContainer.invokeProceed(EJSContainer.java:6207)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:568)
    at org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.callInterceptorsAndDecorators(OpenWebBeansEjbInterceptor.java:528)
    at org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.callToOwbInterceptors(OpenWebBeansEjbInterceptor.java:200)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:548)
    at org.apache.webbeans.ejb.WSEJBInterceptor.callToOwbInterceptors(WSEJBInterceptor.java:152)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.proceed(InvocationContextImpl.java:548)
    at com.ibm.ejs.container.interceptors.InvocationContextImpl.doAroundInvoke(InvocationContextImpl.java:229)
    at com.ibm.ejs.container.EJSContainer.invoke(EJSContainer.java:6098)
    at com.org.uck.pro.db.out.boundary.EJSLocal1SLOutRepositoryBean_03076fb6.getOuts(EJSLocal1SLOutRepositoryBean_03076fb6.java)
    at com.org.uck.pro.ejb.outs.control.OutBean.getOuts(OutBean.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2/7/18 18:19:36:187 IST]000000 3D BusinessExcep E CNTR0020E:EJB在bean“BeanId(pro-ear#pro-web-0.0.1-SNAPSHOT.war#OutRepositoryBean,null)”上调用方法“getout”时引发了意外(未声明)异常。异常数据:java.lang.NullPointerException
位于org.apache.openjpa.persistence.meta.MetamodelImpl.populate(MetamodelImpl.java:321)
位于org.apache.openjpa.persistence.meta.MetamodelImpl.instantiate(MetamodelImpl.java:255)
位于org.apache.openjpa.persistence.meta.MetamodelImpl.find(MetamodelImpl.java:224)
位于org.apache.openjpa.persistence.meta.MetamodelImpl.(MetamodelImpl.java:89)
位于org.apache.openjpa.persistence.EntityManagerFactoryImpl.getMetamodel(EntityManagerFactoryImpl.java:346)
位于org.apache.openjpa.persistence.EntityManagerFactoryImpl.getCriteriaBuilder(EntityManagerFactoryImpl.java:333)
位于org.apache.openjpa.persistence.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:1649)
位于org.apache.openjpa.persistence.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:101)
在com.ibm.ws.jpa.management.jpaexeminoviage.getCriteriaBuilder(jpaexeminoviage.java:394)
位于com.ibm.ws.jpa.management.JPAEntityManager.getCriteriaBuilder(JPAEntityManager.java:494)
在com.org.uck.pro.db.out.control.OutRepository.getOuts(OutRepository.java:68)
在com.org.uck.pro.db.out.control.OutRepositoryBean.getOuts(OutRepositoryBean.java:108)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)中
位于java.lang.reflect.Method.invoke(Method.java:611)
位于com.ibm.ejs.container.EJSContainer.invokeProcess(EJSContainer.java:6207)
在com.ibm.ejs.container.interceptors.InvocationContextImpl.procedure(InvocationContextImpl.java:568)
位于org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.callinterceptor和decorators(OpenWebBeansEjbInterceptor.java:528)
位于org.apache.webbeans.ejb.common.interceptor.OpenWebBeansEjbInterceptor.calltoowbeansejbinterceptors(OpenWebBeansEjbInterceptor.java:200)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)中
位于java.lang.reflect.Method.invoke(Method.java:611)
在com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)上
在com.ibm.ejs.container.interceptors.InvocationContextImpl.procedure(InvocationContextImpl.java:548)
位于org.apache.webbeans.ejb.WSEJBInterceptor.callToOwbInterceptors(WSEJBInterceptor.java:152)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)中
位于java.lang.reflect.Method.invoke(Method.java:611)
在com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:227)上
在com.ibm.ejs.container.interceptors.InvocationContextImpl.procedure(InvocationContextImpl.java:548)
位于com.ibm.ejs.container.interceptors.InvocationContextImpl.doAroundInvoke(InvocationContextImpl.java:229)
位于com.ibm.ejs.container.EJSContainer.invoke(EJSContainer.java:6098)
在com.org.uck.pro.db.out.boundary.EJSLocal1SLOutRepositoryBean_03076fb6.getOuts(EJSLocal1SLOutRepositoryBean_03076fb6.java)
在com.org.uck.pro.ejb.outs.control.OutBean.getOuts(OutBean.java:109)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
CriteriaBuilder=this.entityManager.getCriteriaBuilder()上的
NullPointerException
,尝试使用
super调用
entitymanager
。entitymanger
仍然存在相同的错误

--
谢谢。

BaseService中没有注入注释

就像你在OutRepositoryBean里做的一样

@Inject @Pro
public EntityManager entityManager;

@ApplicationScoped公共类EntityManager Producer{@PersistenceUnit(unitName=“PRO”)private EntityManager Factory EntityManager Factory;@Produces@Default@RequestScoped公共EntityManager create(){返回this.EntityManager Factory.createEntityManager();}public void dispose(@Disposes@Default EntityManager EntityManager){if(EntityManager.isOpen()){EntityManager.close();}}
@MitchBroadhead:使用容器管理事务!问题是,使用WebSphere 8.0.x时,实体管理器可用,但运行时,
getCriteriaBuilder
不可用。WebSphere使用openJPA!解析以下字段openJPA时正好发生错误。元数据:跟踪:解析字段“com.org.uck.pro.db.permission.entity.permission@-1958444202.permissionName”。[2/8/18 9:52:52:043 IST]00000025 SystemErr R java.lang.NullPointerException[2/8/18 9:52:52:043 IST]00000025 SystemErr R位于org.apache.openjpa.persistence.meta.meta.metamodeimpl.populate(metamodeimpl.java:321)@MitchBroadhead