我正在使用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>
如果您需要更多信息,请告诉我。
答案 0 :(得分:2)
当您使用完整堆栈JavaEE服务器时,您可以简化这一过程。
如果您还没有将MySQL数据源添加到WildFly,那么您可以这样做:
使用以下内容创建名为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
将$HOME
,$USER_NAME
和$PASSWORD
替换为实际值
通过执行以下命令在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作为&#34;模块&#34; 但我发现这种方式要简单得多。
修改您的申请如下:
删除所有冗余依赖项:
<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>
删除AplicationJaxRS
和CustomBinder
类并添加JAXRSConfiguration
类:
/**
* Configures a JAX-RS endpoint
*/
@ApplicationPath("resources")
public class JAXRSConfiguration extends Application {
}
从web.xml中删除altitudeservlet
。如果这是唯一的东西,那么完全删除整个文件。
您应该能够部署此Web应用程序并从以下位置访问它:
http://localhost:8080/altitude-webapp/resources/account
其中altitude-webapp
是WAR文件的名称。