gpt4 book ai didi

Java EntityManager null 与 @PersistenceContext

转载 作者:行者123 更新时间:2023-12-02 02:38:24 26 4
gpt4 key购买 nike

我正在使用 Wildfly 10、Jersey,并使用 @Inject 注入(inject)依赖项。我有 DAO 和 Service 接口(interface),其实现在 CustomBinder 中声明。注入(inject)效果很好,但 EntityManager 是通过 @PersistenceContext 注释注入(inject) null 的。我正在使用 MySQL 并且数据源测试连接正在工作。

API 休息类

@Path("/account")
public class CuentaServiceRS {

@Inject
private ICuentaService cuentaService;

@GET
@Produces(MediaType.APPLICATION_JSON)
public Cuenta getCuenta() {
return cuentaService.getCuentas().get(0);
}

}

ICuentaService实现

@Stateless
public class CuentaServiceImpl implements ICuentaService {

@Inject
private ICuentaDAO cuentaDAO;

@Override
public List<Cuenta> getCuentas() {
List<Cuenta> cuentas = cuentaDAO.getAllCuentas();
cuentas;
}

}

CuentaDAO实现

@Stateless
public class CuentaDAOImpl implements ICuentaDAO {

@PersistenceContext(unitName = "altitudePU")
protected EntityManager em;

@Override
public List<Cuenta> getAllCuentas() {
CriteriaQuery<Cuenta> cq = em.getCriteriaBuilder().createQuery(Cuenta.class);

/...

return resultlist;
}

}

我的持久性单元位于persistence.xml

<persistence-unit name="altitudePU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/AltitudePU</jta-data-source>
<class>ar.com.olx.domain.Cuenta</class>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>

web.xml上配置的servlet

<servlet>
<servlet-name>altitudeservlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>ar.com.villat.bind.ApplicationJaxRS</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

我的自定义AplicationJaxRS,它扩展自ResourceConfig

public class ApplicationJaxRS extends ResourceConfig {

public ApplicationJaxRS(){
register(new CustomBinder());
packages(true, "ar.com.olx");
}

}

CustomBinder

public class CustomBinder extends AbstractBinder {

@Override
protected void configure() {
bind(CuentaServiceImpl.class).to(ICuentaService.class);
bind(CuentaDAOImpl.class).to(ICuentaDAO.class);
}

}

最后,我的 pom.xml 与这篇文章相关的依赖项

<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
</dependency>

<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.jboss.spec.javax.ejb</groupId>
<artifactId>jboss-ejb-api_3.2_spec</artifactId>
<version>1.0.0.Final</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<scope>provided</scope>
</dependency>

如果您需要更多信息,请告诉我。

最佳答案

由于您使用的是全栈 JavaEE 服务器,您可以大大简化这一过程。

如果您还没有向 WildFly 添加 MySQL 数据源,那么您可以这样做:

WildFly 数据源设置

  1. 创建一个名为 deploy-mysql-ds.cli 的文件包含以下内容:

    # Execute offline
    embed-server --server-config=standalone.xml

    deploy $HOME/.m2/repository/mysql/mysql-connector-java-5.1.39.jar

    # Add the application datasource
    data-source add \
    --name=AltitudeDS \
    --driver-name=mysql-connector-java-5.1.39.jar \
    --connection-url=jdbc:mysql://localhost:3306/altitudeDB \
    --jndi-name=java:jboss/datasources/AltitudePU \
    --user-name=$USER_NAME \
    --password=$PASSWORD
  2. 替换$HOME , $USER_NAME$PASSWORD具有实际值(value)

  3. 通过执行以下命令来配置 Wildfly 中的数据源:

    $JBOSS_HOME/bin/jboss-cli.sh --file="deploy-mysql-ds.cli"

您只需执行一次此操作。

请注意 --jndi-name匹配<jta-data-source>...</jta-data-source>在您的 persistence.xml 文件。

您的 Maven 依赖项中不需要 mysql-connector-java-5.1.39.jar,因为它已直接添加到服务器。还有其他解决方案涉及将 jar 添加为“模块”但我发现这种方式要简单得多。

修改申请

修改您的申请如下:

  1. 删除所有冗余依赖项:

    <dependencies>
    <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
    </dependency>
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
    </dependency>
    </dependencies>
  2. 删除 AplicationJaxRSCustomBinder类并添加 JAXRSConfiguration类:

    /**
    * Configures a JAX-RS endpoint
    */
    @ApplicationPath("resources")
    public class JAXRSConfiguration extends Application {
    }
  3. 删除 altitudeservlet来自 web.xml。如果这是其中唯一的内容,则完全删除整个文件。

测试一下

您应该能够部署此 Web 应用程序并从以下位置访问它:

http://localhost:8080/altitude-webapp/resources/account

哪里altitude-webapp是您的 WAR 文件的名称。

关于Java EntityManager null 与 @PersistenceContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889496/

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