使用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
相关产品推荐
相关产品推荐

