Jakarta ee JavaEE Wildfly EJB未注入,仅限war项目

Jakarta ee JavaEE Wildfly EJB未注入,仅限war项目,jakarta-ee,javabeans,war,wildfly,ear,Jakarta Ee,Javabeans,War,Wildfly,Ear,我是JavaEE新手,我创建了一个“hello world”项目,使用Hibernate作为JPA提供者,使用gradle构建并部署到Wildfly。我想对数据库感知类使用@Statelessbean,该类将在DB上执行所有操作,然后将其注入所有包含REST端点的“JAX-RS”类 数据库类: @Stateless public class DatabaseManager { @PersistenceContext EntityManager entityManager;

我是JavaEE新手,我创建了一个“hello world”项目,使用Hibernate作为JPA提供者,使用gradle构建并部署到Wildfly。我想对数据库感知类使用
@Stateless
bean,该类将在DB上执行所有操作,然后将其注入所有包含REST端点的“JAX-RS”类

数据库类:

@Stateless
public class DatabaseManager {

    @PersistenceContext
    EntityManager entityManager;

    public DatabaseManager() {
    }

    public String sayHello() {
        // do some db-stuff
        return "EHLO";
    }
}
休息班:

@Path("/")
@SessionScoped
public class RestMainEndpoint implements Serializable {

    @EJB
    private DatabaseManager databaseManager;

    public RestMainEndpoint() {
    }

    @GET
    @Path("/hello")
    @Produces("text/plain")
    public String helloFromDb() {
        return databaseManager.sayHello();
    }
}
问题是
@EJB私有数据库管理器DatabaseManager总是
null
。它从不注射。

我知道其余的工作正常,因为所有与db无关的端点都工作正常。我还假设创建并初始化了
DatabaseManager
bean,因为我可以在Wildfly管理面板上看到它

我不确定是否正确打包和部署了它-它全部打包到单个
war
并部署我是否需要使用
ear
或创建单独的项目?我尝试过,但无法成功地将其转换为gradle的
ear
项目


编辑:在源文件的
WEB-INF
目录中,我没有任何JAR,只有WEB.xml和最近添加的
beans.xml
(这似乎没有任何效果)。有必要吗

web.xml
内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Desktopeo</display-name>
    <servlet>
        <servlet-name>desktopeo</servlet-name>
        <servlet-class>
            org.glassfish.jersey.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>
                jersey.config.server.provider.packages
            </param-name>
            <param-value>
                edu.desktopeo.server
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>desktopeo</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
      http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">
</beans>
然而,在输出
war
archive
(这实际上是一个zip归档)中,我有很多jar:

我的项目jar:
Commons-1.0.jar
(很少有POJO类)

我的库罐:(我用gradle自己添加的库)

我的数据库相关JAR:

hibernate-commons-annotations-5.0.0.Final.jar
hibernate-core-5.0.2.Final.jar
hibernate-entitymanager-5.0.2.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
sqljdbc4.jar // JDBC driver for MS SQL
其他jar:(可能主要是其他依赖项)


问题解决 正如Steve C在回答中所写的那样,问题与输出
war
中不必要的
jar
s有关。我将它们中的一些更改为
提供的
,这起到了帮助作用(并且使
战争
缩小了4倍)

服务器端渐变构建,供将来参考:

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'idea'

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        jcenter()
    }
}

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}

idea {
    module {
        scopes.PROVIDED.plus += [configurations.provided]
    }
}

dependencies {
    provided 'javax:javaee-api:7.0'
    provided 'org.hibernate:hibernate-core:5.0.2.Final'
    provided 'org.hibernate:hibernate-entitymanager:5.0.2.Final'

    // other libs, with regular "compile"
}

您的EJB没有被注入,因为您已经将自己的JAX-RS实现拷贝打包到web应用中。此实现不知道如何注入EJB

由于这是WildFly 9,您可以去掉所有jersey罐子、它们的依赖项和完整的web.xml

在gradle文件中,您需要确保javaee-api-7.0依赖项的作用域是
提供的
。由于服务器提供这些类,因此不应将其与应用程序打包。您还需要完全删除对以下内容的渐变引用:

  • 激活-1.1.jar
  • geronimo-jta_1.1_spec-1.1.1.jar
  • javax.annotation-api-1.2.jar
  • java.inject-1.jar
  • javax.inject-2.4.0-b31.jar
  • javax.mail-1.5.0.jar
  • javax.ws.rs-api-2.0.1.jar
  • validation-api-1.1.0.Final.jar
  • xml-api-1.0.b2.jar
因为这些类都是由javaee-api-7.0依赖项提供的

最后,添加一个java源文件,其中包含:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
}

它提供了随web.xml一起删除的配置,您应该可以开始了。

请在应用程序的web-INF/lib目录中添加所有jar文件的列表。它应该像你描述的那样工作得很好。@SteveC刚刚编辑了我的问题:)非常感谢Steve,它很有帮助!我已经对我的问题进行了编辑,以包括适当的
build.gradle
文件,“面向未来的一代”;)如果我想用自己的子系统替换Wildfly的jaxrs子系统(特别是我想使用Jersey而不是RestEasy),该怎么办?使用RestEasy,我也能够做到这一点,但如果我通过
jboss部署结构.xml
禁用
jaxrs
子系统,并添加
jersey 2.19
及其
javax.ws.rs-api-2.0.1.jar
依赖项,我将无法使注入工作。就好像给定的jaxrs.jar不知道如何管理注入一样。。。我能用一个有注入管理逻辑的来替换它并使它工作吗?据我所知,这不容易做到。球衣给了你什么RestEasy没有的?
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'idea'

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        jcenter()
    }
}

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}

idea {
    module {
        scopes.PROVIDED.plus += [configurations.provided]
    }
}

dependencies {
    provided 'javax:javaee-api:7.0'
    provided 'org.hibernate:hibernate-core:5.0.2.Final'
    provided 'org.hibernate:hibernate-entitymanager:5.0.2.Final'

    // other libs, with regular "compile"
}
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
}