在GlassFish中加载RESTful Web应用时如何解决IllegalStateException?
这个错误java.lang.NoSuchMethodError: com.sun.research.ws.wadl.Response.getRepresentationOrFault()Ljava/util/List是典型的Jersey依赖版本冲突导致的,我之前调试类似项目时也碰到过,大概率是你的项目里混入了不同版本的Jersey相关Jar包,或者WADL类库版本不兼容。下面是具体的排查和解决步骤:
1. 统一Jersey核心依赖版本
你在web.xml里配置的是Jersey 1.x的Servlet容器类com.sun.jersey.spi.container.servlet.ServletContainer,所以必须保证所有Jersey相关依赖(比如jersey-core、jersey-server、jersey-servlet)都是同一个1.x版本,绝对不能混合Jersey 1.x和2.x的依赖——这是最常见的冲突原因。
如果用Maven管理依赖,建议通过属性统一版本:
<properties> <jersey.version>1.19.4</jersey.version> <!-- 选一个稳定的1.x版本 --> </properties> <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>${jersey.version}</version> </dependency> </dependencies>
2. 排查并排除冲突的WADL依赖
com.sun.research.ws.wadl.Response类属于WADL相关库,如果你的项目里有其他依赖间接引入了不同版本的WADL Jar,就会出现方法找不到的问题。可以用Maven的依赖树命令排查:
mvn dependency:tree
找到所有包含com.sun.research.ws.wadl的依赖,然后通过<exclusions>标签排除冲突的版本:
<dependency> <groupId>你的其他依赖groupId</groupId> <artifactId>你的其他依赖artifactId</artifactId> <version>版本号</version> <exclusions> <exclusion> <groupId>com.sun.research.ws.wadl</groupId> <artifactId>wadl-core</artifactId> </exclusion> </exclusions> </dependency>
3. 清理项目并重新构建
- 清理本地项目的
target(或build)目录,删除旧的编译文件和依赖Jar - 重新执行构建命令(
mvn clean install或Gradle的clean build) - 如果是部署到本地Tomcat,检查Tomcat的
lib目录里有没有和项目依赖冲突的Jar,尽量让项目依赖独立,不要依赖Tomcat自带的类库
4. 确认web.xml配置匹配依赖版本
你的web.xml配置是正确的Jersey 1.x格式,不需要修改,但要确保没有误引入Jersey 2.x的依赖(比如org.glassfish.jersey.*开头的Jar),如果有,直接删除这些不兼容的依赖。
按照上面的步骤操作后,应该就能解决这个启动异常了。
内容的提问来源于stack exchange,提问作者Samuel

