RESTEASY003900报错:Jetty升级9.4.29以上版本找不到Provider类公共构造函数
错误原因
- 你定义的
HealthResource、TestApplication都是JettyTest的非静态内部类,非静态内部类的实例化必须依赖外部类JettyTest的实例,RESTEasy在实例化Provider时无法自动传入外部类实例,因此找不到可用的构造方法。 TestApplication带@Context ServletConfig的构造函数中,向singleton集合添加的是HealthResource.class类对象,singleton集合要求存入的是类的实例而非类对象。- 测试代码中请求路径为
/api/res,但实际接口定义的路径是/api/health,路径不匹配会导致404错误。 - pom.xml中
jetty-servlet依赖的scope设置为provided,嵌入式Jetty运行时不会加载provided scope的依赖,会出现类缺失错误。 - 同时配置了
resteasy.scan=true和自定义Application实现,两者功能重叠可能引发配置冲突。
修复步骤
- 将
HealthResource和TestApplication两个内部类修改为静态类,添加static修饰符:
@Path("/health") public static class HealthResource { // 原有代码不变 } @ApplicationPath("/api") public static class TestApplication extends Application { // 原有代码不变 }
- 移除
TestApplication构造函数中向singleton集合添加类对象的逻辑,你已经重写了getClasses方法返回资源类,不需要额外配置singleton:
public TestApplication(@Context ServletConfig servletConfig) { // 删掉该行:singletons.add(HealthResource.class); }
- 修改测试代码的请求路径,改为匹配的接口路径:
given().spec(spec).when().get("/api/health").then().statusCode(200);
- 修改pom.xml中
jetty-servlet的依赖配置,移除providedscope:
<dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>9.4.43.v20210629</version> <!-- 删掉scope配置行 --> </dependency>
- 移除servletHolder的
resteasy.scan初始化参数,避免和自定义Application冲突:
// 删掉该行:servletHolder.setInitParameter("resteasy.scan", "true");
内容的提问来源于stack exchange,提问作者Thomas DK
相关产品推荐
相关产品推荐

