带有@PersistenceContext的Java EntityManager null

时间:2017-08-25 21:14:03

标签: java maven wildfly entitymanager jta

我正在使用Wildfly 10,Jersey,并使用@Inject注入依赖项。我有一个DAO和Service接口,其实现在CustomBinder中声明。注入效果很好,但 EntityManager 会使用 @PersistenceContext 注释注入 null 。我正在使用MySQL,数据源测试连接正在运行。

API Rest class

@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>

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

1 个答案:

答案 0 :(得分:2)

当您使用完整堆栈JavaEE服务器时,您可以简化这一过程。

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

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替换为实际值

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

    $JBOSS_HOME/bin/jboss-cli.sh --file="deploy-mysql-ds.cli"
    
  4. 你只需要这样做一次。

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

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

    修改申请

    修改您的申请如下:

    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. 从web.xml中删除altitudeservlet。如果这是唯一的东西,那么完全删除整个文件。

    4. 测试

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

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

      其中altitude-webapp是WAR文件的名称。