Jetty.xml配置Swagger UI:resourceBase属性配置难题
我完全懂你现在的卡点——把Jetty的程序化配置转成XML时,没法直接调用类加载器方法来设置resourceBase确实头疼。别慌,我来一步步帮你搞定:
1. 先确认Swagger UI的WebJar依赖已到位
首先要确保项目里已经引入了对应版本的Swagger UI WebJar,如果用Maven的话,在pom.xml里加这段依赖:
<dependency> <groupId>org.webjars</groupId> <artifactId>swagger-ui</artifactId> <version>2.1.4</version> </dependency>
Gradle项目对应调整即可,这一步是让Swagger的静态资源能被类加载器正常访问到。
2. 用Jetty支持的类路径写法配置ResourceBase
Jetty允许在resourceBase中使用classpath:前缀直接引用类路径下的资源,刚好对应你程序化代码里的类加载器逻辑。你只需要把XML里空的<Set name="resourceBase"></Set>改成:
<Set name="resourceBase">classpath:META-INF/resources/webjars/swagger-ui/2.1.4</Set>
这个写法和你代码里InsectopediaServer.class.getClassLoader().getResource("META-INF/resources/webjars/swagger-ui/2.1.4")的效果完全一致,Jetty会自动通过类加载器定位到这个资源目录。
3. 调整Handler结构匹配程序化逻辑
看你的代码,是把业务servletContext和Swagger的resourceContext都放到ContextHandlerCollection里,再把这个集合设置给Server。但你当前的jetty.xml Handler结构有点乱,需要调整成和代码逻辑一致的层级:
修改后的完整相关配置片段如下:
<Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <!-- 存放业务上下文和Swagger资源上下文的集合 --> <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <!-- 这里保留你原有的业务Servlet Context配置 --> <Item> <!-- 你的业务servlet context配置代码 --> </Item> <!-- Swagger UI的资源上下文 --> <Item> <New class="org.eclipse.jetty.server.handler.ContextHandler"> <Set name="contextPath">/api/</Set> <Set name="handler"> <New class="org.eclipse.jetty.server.handler.ResourceHandler"> <Set name="resourceBase">classpath:META-INF/resources/webjars/swagger-ui/2.1.4</Set> <!-- 可选:开启目录列表,方便调试时查看资源结构 --> <Set name="directoriesListed">true</Set> </New> </Set> </New> </Item> </Array> </Set> </New> </Item> <!-- 处理404等默认情况的Handler --> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler" /> </Item> </Array> </Set> </New> </Set>
调整后,Handler层级就和你代码里的逻辑完全匹配了:Server的顶级Handler是HandlerCollection,里面包含存放业务和Swagger上下文的ContextHandlerCollection,以及处理默认请求的DefaultHandler。
4. 验证配置
启动Jetty后,访问http://你的服务器地址/api/index.html,就能看到Swagger UI界面了。如果遇到404,可以先排查这几点:
- WebJar依赖是否正确引入,有没有下载到本地仓库
resourceBase里的路径是否和WebJar包内的实际路径一致(可以解压WebJar包确认)- ContextPath是否和访问路径匹配(比如配置的是
/api/,访问时要带斜杠)
内容的提问来源于stack exchange,提问作者Bernardo Lopes

