使用Arquillian测试Spring REST服务时遇ClassNotFoundException: JspServlet
解决Arquillian测试SpringBoot REST服务时JspServlet找不到的问题
这个报错我之前也踩过坑,本质就是Arquillian部署的Web应用里找不到JSP相关的类文件——要么是测试阶段没加对应依赖,要么是SpringBoot默认配置触发了容器加载JSP组件,但又没提供对应的类支持。给你几个实用的解决思路:
1. 添加Jasper依赖(如果确实需要JSP支持)
如果你的测试或应用本身涉及JSP视图,直接在pom.xml里加上Tomcat嵌入版的Jasper依赖,把scope设为test,只在测试阶段生效:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>test</scope> </dependency>
Gradle用户对应的配置是:
testImplementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
2. 禁用JSP相关配置(REST服务推荐方案)
既然你写的是REST服务,完全不需要JSP视图解析,那直接让SpringBoot别去加载JSP相关组件就行:
- 在测试专用配置文件(比如
src/test/resources/application-test.properties)里添加:
# 禁用JSP视图解析器 spring.mvc.view.prefix= spring.mvc.view.suffix=
- 或者在测试类上直接排除JSP相关的自动配置:
@SpringBootTest @EnableAutoConfiguration(exclude = {InternalResourceViewResolverAutoConfiguration.class}) public class YourRestControllerTest { // 测试代码逻辑 }
3. 确保Arquillian部署包包含Jasper类
如果用ShrinkWrap手动构建部署包,记得把Jasper依赖添加到部署的WebArchive中:
@Deployment public static WebArchive createDeployment() { return ShrinkWrap.create(WebArchive.class) .addPackages(true, "com.your.rest.package") // 引入Jasper依赖及其传递依赖 .addAsLibraries(Maven.resolver() .resolve("org.apache.tomcat.embed:tomcat-embed-jasper") .withTransitivity() .asFile()); }
一般来说,REST服务用第二种方法最省心,直接禁用JSP相关的自动配置,避免容器去加载不需要的JspServlet,自然就不会报找不到类的错了。
内容的提问来源于stack exchange,提问作者Fuv
相关产品推荐
相关产品推荐

