当前位置: 首页 > 知识库问答 >
问题:

Spring Jboss:在查找实体管理器时抛出NullPointerExcsion

扶绍辉
2023-03-14

我正在尝试配置spring框架JPA

try {
            /**
             * intentionally breaking code into two for testing
             * */
            AbstractJpaEntity entity = null;
            /**
             * below line of code throws exception
             * 1) Type, id & em, none of them found null at run-time
             * */
            if(em.find(type, id)!=null){
                entity = em.find(type, id);
            }
            return entity;
        } catch (NoResultException nre) {
            throw new WalletException("no entity found", nre);
        }

因此,每当执行上述代码时,em.find(type,id)抛出空指针异常。我尝试调试,发现id和类型具有预期的定义值,甚至em具有以下值:-

这表示xml中定义的持久化单元已正确加载,同样表示服务器启动日志。令人恼火的是,即使没有任何内容为null,但仍然会引发null指针异常。stacktrace如下所示:-

[org.apache.catalina.core.ContainerBase.[jboss.web]。[默认主机]。[/AltSurvey]。[rest]](http--0.0.0.0-34567-2)Servlet。servlet rest的service()引发异常:java。org上的lang.NullPointerException。冬眠发动机交易内部的jta。JtaStatusHelper。getStatus(JtaStatusHelper.java:73)[hibernate-core-4.0.1.Final.jar:4.0.1.Final]位于org。冬眠发动机交易内部的jta。JtaStatusHelper。isActive(JtaStatusHelper.java:115)[hibernate-core-4.0.1.Final.jar:4.0.1.Final]位于org。冬眠发动机交易内部的jta。CMT交易。在org上加入(CMTTransaction.java:149)[hibernate-core-4.0.1.Final.jar:4.0.1.Final]。冬眠ejb。AbstractEntityManagerImpl。joinTransaction(AbstractEntityManagerImpl.java:1207)[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]位于org。冬眠ejb。AbstractEntityManagerImpl。postInit(AbstractEntityManagerImpl.java:176)[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]位于org。冬眠ejb。EntityManagerImpl。(EntityManagerImpl.java:89)[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]位于org。冬眠ejb。EntityManagerFactoryImpl。在org上创建entitymanager(EntityManagerFactoryImpl.java:125)[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]。冬眠ejb。EntityManagerFactoryImpl。在sun上创建entitymanager(EntityManagerFactoryImpl.java:120)[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)[rt.jar:1.7.0_67]。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)[rt.jar:1.7.067]。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)[rt.jar:1.7.0_67]。朗。反思。方法在org上调用(Method.java:606)[rt.jar:1.7.0_67]。springframework。奥姆。jpa。AbstractEntityManagerFactoryBean。org上的invokeProxy方法(AbstractEntityManagerFactoryBean.java:376)[spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]。springframework。奥姆。jpa。AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler。在com上调用(AbstractEntityManagerFactoryBean.java:517)[spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]。太阳代理$Proxy37。组织上的createEntityManager(未知源)。springframework。奥姆。jpa。SharedEntityManager创建者$SharedEntityManager职业处理者。在com上调用(SharedEntityManagerCreator.java:234)[spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]。太阳代理$Proxy47。在com上查找(未知源)。备选调查。常见的db。刀。杰帕多。findById(AbstractJpaDao.java:84)[类:]

我已经检查了与配置相关的所有XML。但无法怀疑出现异常的任何原因。我正在攻击下面的XML:-

persistence.xml

<persistence-unit name="TalentPactFormEngine_New"
        transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/jdbc/TalentPactFormEngine_New</jta-data-source>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.default_schema" value="dbo" />
            <property name="hibernate.generate_statistics" value="true" />
            <property name="hibernate.cache.use_second_level_cache"
                value="true" />
            <property name="hibernate.cache.use_query_cache" value="true" />
            <property name="hibernate.cache.infinispan.cachemanager"
                value="java:jboss/infinispan/hibernate" />
        </properties>
    </persistence-unit>

HibernatePaconfig。xml

<bean id="surveyDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        scope="singleton" destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${user}" />
        <property name="password" value="${password}" />
    </bean>

    <bean id="entityManagerFactory" depends-on="surveyDataSource"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="surveyDataSource" />
        <property name="persistenceXmlLocation" value="classpath:persistence.xml" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />

应用程序上下文。xml

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <!-- <property name="jndiName" value="java:/jdbc/TalentPactFormEngine_New" 
            /> -->
        <property name="environment" ref="remoteEnv" />
    </bean>

    <jee:jndi-lookup id="wcDataSource"
        jndi-name="java:/jdbc/TalentPactFormEngine_New" resource-ref="false"
        environment-ref="remoteEnv" expected-type="javax.sql.DataSource" />

    <util:properties id="remoteEnv">
        <prop key="java.naming.provider.url">http://survey.peoplestrong.com:34567
        </prop>
        <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
        <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
        <prop key="jnp.disableDiscovery">true</prop>
    </util:properties>

最后是独立的JBoss服务器

<datasource jta="true" jndi-name="java:/jdbc/TalentPactFormEngine_New" pool-name="TalentPactFormEngine_New" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>jdbc:jtds:sqlserver://192.168.0.226:1433/talentpactformengine_new</connection-url>
                    <driver>net.sourceforge.jtds</driver>
                    <security>
                        <user-name>bla</user-name>
                        <password>blabla</password>
                    </security>
                </datasource>

无法找到NullPointer异常的原因,任何类型的帮助都将非常有用。

共有1个答案

朱翔
2023-03-14

正如你在org.hibernate.engine.transaction.internal.jta.JtaStatusHelper的src代码中看到的

事务管理器必须为空

final int status = transactionManager.getStatus();

检查事务管理器的配置。

 类似资料:
  • 和 只是使用不同的jndi名称(即CHServiceBean com.....)的javax.persistence.EntityManager类型的java:comp/env/chjpa引用,等等)得到了相同的错误。 最后,根据这篇文章:访问EntityManager时的错误-openjpa-自由配置文件似乎是我不能拥有完整的JavaEE7特性并运行JPA2.0吗?请指教!

  • 问题内容: 我有以下活动: 我得到一个NPE,当我尝试调用的,我猜这是因为是一个独立的片段,我有作为之内: 但是,我不确定如何解决此问题,以便可以找到loginButton ID。我以前没有使用过片段,所以我意识到我可能正在使用它们/错误地实现了它们。包含在几个按钮,并没有什么,但一个。 问题答案: 从片段编写代码以初始化按钮,因为您的按钮进入片段布局而不是活动布局。 而从删除登录按钮相关的代码的

  • 我试图使用spring boot将EntityManager注释注入到我的DAO中,但是得到一个< code > InvalidDataAccessApiUsageException 消息,说没有可用的事务EntityManager。我的印象是,只要Spring Boot从< code>application.yml中获得了我的数据源信息,并且我用< code>@PersitenceContext

  • 在我的DAO类中,假设我有实体管理器'em'是由实体管理器工厂制作的,之后的代码如下所示:- 当我执行上面的代码行时,在堆内存中创建了一个对象,并在其中存储了其实例变量“xyz”的值。 在第3行之后,如我们所知,carEntity对象进入托管状态。它将不会转到数据库,直到我刷新或提交事务。 那么实体管理器如何知道一个实体已经进入托管状态呢?执行后,是否为CarEntity创建了一个新对象?或者它在

  • http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“> 但面对这个例外: 任何帮助都将不胜感激...

  • 我有一个在Eclipse中定义的非常基本的JavaEE应用程序(一个EJB,一个带有PrimeFaces的网页,一个JPA实体)。它有四个项目,一个用于EAR,一个用于EJB,一个用于JPA,一个用于Web部件。问题是,我试图在JPA项目的persistence.xml中配置HiberNate作为持久化框架,但它并没有像我预期的那样完全工作。在我的EJB(@Statless)中,我可以通过两种方式