Arquillian远程Wildfly测试时依赖注入不生效问题
Arquillian对接远程Wildfly时CDI注入失效修复
具体问题和对应调整
- Arquillian核心依赖版本错配
你现在pom里arquillian-junit-container用的1.7.0.Alpha10,arquillian-protocol-servlet用的1.6.0.Final,两个核心包版本不统一,会直接导致测试类字节码增强、Servlet协议适配逻辑异常,CDI上下文根本没法正常传递到测试实例。
直接把这两个依赖的版本都改成1.7.0.Final正式版就行,别混着用Alpha版和正式版。嫌手动管版本麻烦就加个arquillian-bom在dependencyManagement里锁版本,后续不会再出版本冲突问题。 - Wildfly远程容器适配器用了测试版
你引的wildfly-arquillian-container-remote是5.0.0.Alpha3,这是没发正式版的测试包,和你用的Wildfly26.1.1.Final有已知的CDI上下文传递bug,换正式版就好,版本改成4.0.0.Final,这个是官方验证过兼容Wildfly23-26全系列的稳定版。 - 没指定默认激活的容器
你arquillian.xml里同时配了managed和remote两个容器,但是没标哪个是默认用的,跑arq-remote profile的时候Arquillian有可能误选managed的配置,部署和测试执行的逻辑和远程环境不匹配,注入当然失效。
把remote容器的配置段加个default标记就行:<container qualifier="remote" default="true"> <configuration> <property name="managementAddress">127.0.0.1</property> <property name="managementPort">9990</property> <!-- 要是你的Wildfly开了管理端口认证,把下面两个配置补上,填你控制台的账号密码 --> <!-- <property name="username">admin</property> <property name="password">admin</property> --> </configuration> </container> - CDI扫描配置不严谨
你现在打包的时候只加了个空的beans.xml,CDI2.0默认的bean发现模式是annotated,虽然TestService加了@Named,但是远程部署时类加载层级复杂的时候很容易漏扫。
别用空的beans.xml,换成显式指定扫描模式的配置,文件放src/test/resources下,还是用addAsWebInfResource打包进去:<?xml version="1.0" encoding="UTF-8"?> <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_2_0.xsd" bean-discovery-mode="all" version="2.0"> </beans>
验证步骤
改完直接跑mvn clean test -Parq-remote,你之前开了deploymentExportPath配置,测试时会把部署的war包导出到target目录,解压了确认三个点就行:
- WEB-INF下面的beans.xml是你刚改的带全量扫描配置的版本
- WEB-INF/classes里能找到TestService、ITestService对应的class文件
- WEB-INF/lib里没有混着不同版本的Arquillian相关jar包
这三点都满足的话,CDI注入就能正常工作,不会再出现注入为null的问题。
内容的提问来源于stack exchange,提问作者userx
相关产品推荐
相关产品推荐

