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

使用RestAssured调用GET ID接口返回500内部服务器错误,Swagger手动请求正常的问题排查求助

问题分析与解决方案

从你提供的错误堆栈来看,这个500错误的根源是服务端在Java 9+环境下的JAXB序列化反射权限问题——具体是com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass为null。这是因为Java 9引入模块化系统后,JAXB的反射访问被默认限制,导致无法动态生成类来序列化XML响应。

为什么Swagger能正常运行?

Swagger的请求大概率默认设置了Accept: application/json,让服务端返回JSON格式,绕开了XML序列化的流程;或者Swagger所在的运行环境是Java 8(JAXB是Java 8的核心库,没有模块化限制),所以不会触发这个问题。而你的RestAssured请求里Accept头是*/*(从请求日志能看到Accept=*/*),服务端默认返回XML,触发了JAXB的bug。

解决方案一:修改RestAssured请求,指定Accept为JSON

最简单的办法是让服务端返回JSON,避免XML序列化的问题。在你的请求里添加accept(ContentType.JSON):

public class GetRecord {
    public static void main(String[] args) {
        RestAssured
                .given()
                .log().all()
                .baseUri("http://localhost:8080/app/")
                .basePath("videogames/{videoGameId}")
                .pathParam("videoGameId",1)
                .contentType(ContentType.JSON)
                .accept(ContentType.JSON) // 添加这一行,指定接受JSON格式
                .when()
                .get()
                .then()
                .log().all()
                .statusCode(200);
    }
}

解决方案二:给服务端JVM添加启动参数,开放反射权限

如果必须让服务端支持XML响应,需要给运行服务端的JVM添加以下启动参数,开放JAXB所需的反射权限:

--add-opens java.base/java.lang.reflect=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
--add-modules java.xml.bind

解释:

  • --add-opens:开放java.lang.reflect和java.lang包的反射访问权限,JAXB动态生成类需要这些权限
  • --add-modules java.xml.bind:Java 9+中JAXB是可选模块,需要显式引入

补充验证

你之前的POST请求能成功,大概率是因为POST请求的响应是JSON格式,或者请求头里已经隐含了Accept: JSON,所以没有触发XML序列化的问题。

内容的提问来源于stack exchange,提问作者Prateek Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:03:11