如何解决Arquillian Remote在GlassFish5、NetBeans8中的REST调用异常?
解决Arquillian测试中RESTEASY004655调用请求失败的问题
我之前在GlassFish 5搭配Arquillian做Resteasy测试时也踩过这个坑,RESTEASY004655这个错误通常是配置冲突、测试客户端设置不对或者依赖缺失导致的,咱们一步步来排查解决:
1. 解决Resteasy与GlassFish的依赖冲突
GlassFish 5本身自带JAX-RS的官方实现Jersey,如果你直接引入Resteasy,很容易出现依赖冲突。你需要在POM里给Resteasy依赖排除掉和Java EE规范重复的包,同时选择适配Java EE 8的Resteasy版本(比如3.15.x系列):
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.15.1.Final</version> <scope>test</scope> <exclusions> <exclusion> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> </exclusion> <exclusion> <groupId>org.jboss.spec.javax.annotation</groupId> <artifactId>jboss-annotations-api_1.3_spec</artifactId> </exclusion> </exclusions> </dependency>
2. 确认Arquillian部署的配置正确性
你的测试部署包必须正确配置Resteasy的运行环境,要么通过web.xml注册Resteasy的Servlet,要么用注解方式启用:
方式一:web.xml配置
<servlet> <servlet-name>ResteasyDispatcher</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>com.tutorial.bookstore.rest.BookApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ResteasyDispatcher</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
方式二:无web.xml注解方式
确保你的Application子类添加了@ApplicationPath注解,并且被Arquillian打包到部署包中:
@ApplicationPath("/api") public class BookApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(BookEndpoint.class); return classes; } }
3. 修正测试客户端的地址与初始化方式
在Arquillian测试中,绝对不能硬编码应用地址,必须通过@ArquillianResource注入部署后的真实base URL,然后用这个地址初始化Resteasy客户端:
@RunWith(Arquillian.class) public class BookEndpointTest { @Deployment(testable = false) public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addClasses(BookEndpoint.class, BookApplication.class, Book.class) .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); } @ArquillianResource private URL baseUrl; private ResteasyClient client; private ResteasyWebTarget target; @Before public void setUp() { // 初始化Resteasy客户端 client = new ResteasyClientBuilder().build(); // 拼接正确的API路径 target = client.target(baseUrl.toExternalForm() + "api"); } @Test public void createBook() { Book testBook = new Book("Test Book", "Test Author"); Response response = target.path("/books") .request(MediaType.APPLICATION_JSON) .post(Entity.json(testBook)); // 这里添加你的断言逻辑,比如检查响应状态码 assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); response.close(); } @After public void tearDown() { client.close(); } }
4. 查看GlassFish日志定位底层问题
RESTEASY004655是一个上层错误,你可以去GlassFish的domains/domain1/logs/server.log文件里找完整的堆栈信息,通常能发现更具体的问题:
- 如果是JSON序列化失败,需要添加Resteasy的Jackson依赖:
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson2-provider</artifactId> <version>3.15.1.Final</version> <scope>test</scope> </dependency>
- 如果是类找不到的错误,检查部署包中是否包含了所有需要的类。
内容的提问来源于stack exchange,提问作者pitchblack408
相关产品推荐
相关产品推荐

