gpt4 book ai didi

java - Ejb不会初始化实体管理器

转载 作者:行者123 更新时间:2023-12-02 10:32:46 32 4
gpt4 key购买 nike

我的英语不是我的母语,所以我对我糟糕的英语提前表示歉意。当我使用实体管理器、实体工厂管理事务并获取事务时,我的项目运行良好。我想使用 ejb 来为我处理事务。为了让它工作,我做了所有需要的事情,但是 ejb 不会初始化实体管理器,他将保持为空。我不明白我做错了什么。我已经使用 jta 数据源配置了 persistance.xml 并完成了所需的所有注释,但仍然无法使其工作。我尝试创建一个查询时出现空指针异常,并且实体管理器为空。我一直在寻找并寻找解决方案,但没有成功。我希望这里有人能找到答案。谢谢您的宝贵时间!

持久性.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();

它应该被注入(inject)(因此不需要 = new PersonService();)或通过构造函数创建,但该实例不由任何容器管理,因此,那里不会发生注入(inject)并且 EntityManager em 保持 null

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

@EJB
PersonService personService;

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

关于java - Ejb不会初始化实体管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53513757/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com