[英]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&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&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.