【问题标题】:Arquillian Integration with WildFly 10Arquillian 与 WildFly 10 的集成
【发布时间】:2018-01-16 20:16:36
【问题描述】:

谁能指导我如何将 Arquillian 与 WildFly 10 一起使用。我最近将我的应用程序从 JBoss 7 迁移到 WildFly 10。Arquillian 曾经与 JBoss 7 一起使用,但相同的配置不适用于 WildFly 10。

我现在可以集成,但是我的 JNDI 名称为“java:global/xyz/xyzEMFactor”的 EJB 失败并出现以下错误:

原因:java.lang.Exception: {"WFLYCTL0180: 缺少/不可用依赖项的服务" => ["jboss.naming.context.java.module.test.test.env.\"com.xyz.abc .poc.knowledge_ba‌​se.ontology.DBContex‌​tBean\".emFactory 在 org.jboss.as.controller.client.helpers 中缺少 [jboss.naming.context.java.global.xyz_dal.xyzpEMFactory‌​]"]}。 Standalone.impl.Serve‌​rDeploymentPlanResul‌​tFuture.getActionRes‌​ult(ServerDeployment‌​PlanResultFuture.jav‌​a:134)

以下是我的课:

@AccessTimeout(5 * 60 * 60 * 1000)
@StatefulTimeout(-1)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class DBContextBean<T> {
    @Inject
    @EJB(lookup = "java:global/xyz_dal/xyzEMFactory")
    private xyzEMFactory emFactory;
}

【问题讨论】:

  • 您需要展示您的测试、arquillian.xml 文件以及您遇到的任何错误
  • 问题是这是一个很大的变化,例如 CDI 是完全不同的规范。您是否尝试过在 Wildfly 10 中运行相同的 WAR 并检查它是否有效?

标签: wildfly jboss-arquillian wildfly-10 ejb-3.2


【解决方案1】:

我不知道这在 JBoss7 中是如何工作的,但是:@EJB 或 @Inject,我认为 @Inject 都是多余的。根据我的经验,wildfly 在查看不明确的结构时有时比 jboss7 更严格。

@Inject
@EJB(lookup = "java:global/xyz_dal/xyzEMFactory")
xyzEMFactory emFactory;

CDI 无法注入 ejb。我们有时会做的是:

@Produces
@EJB(lookup = "java:global/xyz/xyzEMFactory")
xyzEMFactory emFactory;

然后你可以在其他地方使用

@Inject
xyzEMFactory emFactory;

因为注入ejb的bean可以用作Producer-Field。

【讨论】:

    【解决方案2】:

    这是因为,可测试的战争文件,我正在创建一个 jar,

    @Deployment(name = "xyz_dal", order = 3)
    public static Archive<?> createDeployment() {
        JavaArchive jar = ShrinkWrap.create(JavaArchive .class, "xyz_dal.jar")
                .addClasses(xyzEMFactory.class, DBContextBean.class, xyzDao.class)
                .addPackages(true, "com.xyz.abc.poc.entities")
                .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml").setManifest(new Asset() {
                    @Override
                    public InputStream openStream() {
                        // dependency management
                        return ManifestBuilder.newInstance()
                                .addManifestHeader("Dependencies", "xyz,javax.api,deployment.abc_common.jar")
                                .openStream();
                    }
                });
        return jar;
    }
    

    当我将其更改为时它起作用了

    @Deployment(name = "xyz_dal", order = 3)
    public static Archive<?> createDeployment() {
        WebArchive jar = ShrinkWrap.create(WebArchive.class, "xyz_dal.war")
                .addClasses(xyzpEMFactory.class, DBContextBean.class, xyzDao.class)
                .addPackages(true, "com.xyz.abc.poc.entities")
                .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml").setManifest(new Asset() {
                    @Override
                    public InputStream openStream() {
                        // dependency management
                        return ManifestBuilder.newInstance()
                                .addManifestHeader("Dependencies", "xyz,javax.api,deployment.abc_common.jar")
                                .openStream();
                    }
                });
        return jar;
    }
    

    这是因为当我创建一个可测试的 jar 时,容器将 jar 包装在 test.war 中,因此上下文“java:global/xyz/xyzEMFactory”不可用。

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2014-03-18
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2018-08-31
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多