Интеграция Arquillian с WildFly 10

Может ли кто-нибудь объяснить мне, как использовать Arquillian с WildFly 10. Недавно я перенес свое приложение с JBoss 7 на WildFly 10. Раньше Arquillian работал с JBoss 7, но та же конфигурация не работает на WildFly 10.

Теперь я могу интегрироваться, однако мои EJB с именами JNDI как «java: global/xyz/xyzEMFactor» не работают со следующей ошибкой:

Причина: java.lang.Exception: {"WFLYCTL0180: Службы с отсутствующими/недоступными зависимостями" => ["jboss.naming.context.java.module.test.test.env.\"com.xyz.abc.poc. Knowledge_ba‌​se.ontology.DBContex‌​tBean\”.emFactory отсутствует [jboss.naming.context.java.global.xyz_dal.xyzpEMFactory‌​]"]} в org.jboss.as.controller.client.helpers.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;
}

person Purnendu Rath    schedule 09.08.2017    source источник
comment
Вам нужно показать свой тест, файл arquillian.xml и любые ошибки, с которыми вы сталкиваетесь.   -  person Steve C    schedule 09.08.2017
comment
Дело в том, что это большое изменение, например CDI — это совсем другая спецификация. Вы пытались запустить ту же WAR в Wildfly 10 и проверить, работает ли она?   -  person lordofthejars    schedule 10.08.2017


Ответы (2)


Это было потому, что тестируемый военный файл я создавал банку как,

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

Это произошло потому, что когда я создавал тестируемую банку, контейнер оборачивал банку в test.war, и, следовательно, контекст «java: global/xyz/xyzEMFactory» был недоступен.

person Purnendu Rath    schedule 31.10.2017

Я не знаю, как это может работать в JBoss7, но: либо @EJB, либо @Inject, полагаю, @Inject лишние. По моему опыту, wildfly иногда более строг, чем jboss7, когда смотрит на неясные конструкции.

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

CDI не может внедрять ejbs. Что мы делаем иногда:

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

Затем вы можете использовать в других местах

@Inject
xyzEMFactory emFactory;

потому что bean-компонент, внедренный ejb, может использоваться как Producer-Field.

person aschoerk    schedule 30.08.2017