You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:05:06