Ejb不会初始化实体管理器

时间:2018-11-28 06:55:11

标签: java nullpointerexception ejb entitymanager jta

我的英语不是我的母语,所以我对我的英语不好表示抱歉。 当我与实体经理,实体工厂管理交易并获取交易时,我的项目运行良好。 我想使用ejb为我处理交易。 我做了一切必要的工作才能使它正常工作,但是ejb不会激发实体经理,他将保持空虚。 我不明白我在做什么错。 我已经使用jta数据源配置了我的persistance.xml,并做了所有需要的注释,但是仍然无法正常工作。 我尝试创建查询的过程我得到了空指针异常,并且实体管理器为空。 我一直在寻找解决方案,但没有成功。 我希望这里有人能找到答案。 谢谢您的时间!

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="swap" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:jboss/datasources/swap</jta-data-source>

		<class>org.Roper.WebService.Model.User</class>
		<class>org.Roper.WebService.Model.BaseEntity</class>
		<class>org.Roper.WebService.Model.Person</class>
		<class>org.Roper.WebService.Model.Admin</class>
		<class>org.Roper.WebService.Model.BusinessOwner</class>
		<class>org.Roper.WebService.Model.Business</class>
		<class>org.Roper.WebService.Model.Product</class>
		<class>org.Roper.WebService.Model.Category</class>
		<class>org.Roper.WebService.Model.Tourist</class>

		<exclude-unlisted-classes>false</exclude-unlisted-classes>
		<properties>
			<!-- Hibernate properties -->
			<property name="javax.persistence.jdbc.driver"
				value="org.postgresql.Driver" /> <!-- DB Driver -->
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.connection.zeroDateTimeBehavior"
				value="convertToNull" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.transaction.jta.platform"
				value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
			<!-- Database properties -->
			<property name="javax.persistence.jdbc.url"
				value="jdbc:postgresql://hidden/swap?useUnicode=yes&amp;characterEncoding=UTF-8" /> <!-- BD Mane -->
			<property name="javax.persistence.jdbc.user" value="hidden" /> <!-- DB User -->
			<property name="javax.persistence.jdbc.password"
				value="hidden" /> <!-- DB Password -->
		</properties>
	</persistence-unit>
</persistence>

这是调用ejb的主要类:

@Path("PersonService")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class PersonResource {
    private static final Logger logger = Logger.getLogger(PersonResource.class);

    @EJB
    PersonService personService = new PersonService();

    @GET
    @Path("/users")
    public List<Person> getUsers(@BeanParam FilterBean fb)
    {
        logger.info("Getting all users.");
        return personService.GetAllUsers();
    }
}

这是调用实体托管的服务类:

    @Stateless
@LocalBean
public class PersonService {

    private static final Logger logger = Logger.getLogger(PersonService.class);

    @PersistenceContext(unitName="swap")
    public EntityManager em;

    /**
     *This function is querying the database selecting all the person entities.
     *@return List of all the users from the database.
     */
    public List<Person> GetAllUsers()
    {
        logger.debug("Starting to get all users.");

        try {
            try {
                List<Person> users = em.createQuery("SELECT u FROM Person u").getResultList();
                logger.info("Success, got all users.");
                return new ArrayList<Person>(users);
            }
            catch(PersistenceException e)
            {
                if(e.getCause().getCause().getMessage().contains("ERROR: relation \"users\" does not exist"))
                {
                    logger.info("No users in the database.");
                }
                else
                {
                    logger.error("Error while getting users from the database, error: ", e);
                }
            }
        }catch(Exception e)
        {
            logger.error("Cant get the users, error: ",e);
        }
        return null;
    }

standalone-full.xml中的数据源:

  <subsystem xmlns="urn:jboss:domain:datasources:5.0">
        <datasources>
            <datasource jndi-name="java:jboss/datasources/swap" pool-name="swap" enabled="true" use-java-context="true">
                <connection-url>jdbc:postgresql://127.0.0.1:5432/swap?useUnicode=yes&amp;characterEncoding=UTF-8</connection-url>
                <driver>org.postgresql</driver>
                <security>
                    <user-name>postgres</user-name>
                    <password>postgres</password>
                </security>
            </datasource>
            <drivers>
                <driver name="org.postgresql" module="org.postgresql">
                    <driver-class>org.postgresql.Driver</driver-class>
                    <xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
    </subsystem>

1 个答案:

答案 0 :(得分:1)

以下几行看起来可疑:

@EJB
PersonService personService = new PersonService();

它应该被注入(因此不需要= new PersonService();)或通过构造函数创建,但是该实例不受任何容器的管理,因此,那里没有注入发生,EntityManager em停留在{ {1}}。

请按以下方式更新您的代码:

null

除此之外,Integrating JAX-RS with EJB Technology and CDI section of JavaEE 6 tutorial建议JAX-RS资源应该是EJB本身(因此用@EJB PersonService personService; @Stateless注释)或CDI bean(因此用@Stateful注释)或@ApplicationScoped)。我建议在@RequestScoped类本身上添加@Stateless注释。