簡體   English   中英

EJB不會初始化實體管理器

[英]Ejb wont initialize entity manager

我的英語不是我的母語,所以我對我的英語不好對不起。 當我與實體經理,實體工廠管理交易並獲取交易時,我的項目運行良好。 我想使用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>

以下幾行看起來可疑:

@EJB
PersonService personService = new PersonService();

它應該被注入(因此不需要= new PersonService(); )或通過構造函數創建,但是該實例不受任何容器管理,因此,那里沒有注入發生, EntityManager em保持為null

請按以下方式更新您的代碼:

@EJB
PersonService personService;

除此之外, 在JavaEE 6教程的“將JAX-RS與EJB技術和CDI集成”部分中建議,JAX-RS資源應該是EJB本身(因此用@Stateless@Stateful注釋)或CDI bean(因此用@ApplicationScoped@RequestScoped注釋) )。 我建議在PersonResource類本身上添加@Stateless批注。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM