Spring Boot中spring-starter-web的作用及无需它用Jetty提供静态资源的方法
问题1:spring-boot-starter-web在当前架构中的额外价值
对你当前使用Jersey作为REST服务实现、Jetty作为容器的架构来说,spring-boot-starter-web几乎没有不可替代的额外价值,原因如下:
spring-boot-starter-web的核心是Spring MVC的全套组件,包括DispatcherServlet、请求映射处理器、视图解析器、MVC拦截器体系等,你使用Jersey做接口层的场景下完全不需要用到这部分能力,属于冗余依赖spring-boot-starter-web提供的消息转换、全局异常处理、参数校验等能力,Jersey本身都有原生实现,不需要依赖Spring MVC的体系- 你目前用到的仅有的静态资源服务能力,是
spring-boot-starter-web内置的静态资源Servlet自动注册逻辑,确实属于为了小功能引入整套依赖的大材小用场景
问题2:不依赖starter-web,仅通过Jetty实现静态资源服务
实现逻辑非常简单,本质就是手动向Jetty容器注册专门处理静态资源的DefaultServlet,指定资源根路径和映射规则即可,不需要引入额外依赖,推荐两种实现方式:
方式1:通过ServletRegistrationBean注册(最简方案)
直接在Spring容器中注册DefaultServlet的实例,配置资源路径和映射规则:
import org.eclipse.jetty.servlet.DefaultServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class StaticResourceConfig { @Bean public ServletRegistrationBean<DefaultServlet> staticResourceServlet() { // 映射静态资源访问路径为/static/*,可根据需求修改 ServletRegistrationBean<DefaultServlet> registration = new ServletRegistrationBean<>(new DefaultServlet(), "/static/*"); // 指定静态资源根目录为classpath下的static目录 registration.addInitParameter("resourceBase", "classpath:/static/"); // 关闭目录列表访问,需要的话可以设为true registration.addInitParameter("dirAllowed", "false"); // 配置静态资源缓存时间,单位秒 registration.addInitParameter("cacheControl", "max-age=3600"); // 设置优先级低于Jersey的Servlet,避免路径冲突 registration.setLoadOnStartup(2); return registration; } }
注意:如果你的Jersey Servlet配置的是根路径/*,建议将Jersey的路径修改为/api/*这类带前缀的路径,避免和静态资源路径冲突。
方式2:自定义Jetty Server配置(灵活度更高)
如果需要对Jetty做更底层的调整,可以通过JettyServerCustomizer直接修改Jetty服务的handler配置:
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.resource.Resource; import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JettyCustomConfig { @Bean public JettyServerCustomizer staticResourceCustomizer() { return server -> { ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); // 绑定静态资源根路径 context.setBaseResource(Resource.newClassPathResource("/static/")); // 注册静态资源处理Servlet ServletHolder defaultServletHolder = new ServletHolder("static-resource", DefaultServlet.class); defaultServletHolder.setInitParameter("dirAllowed", "false"); context.addServlet(defaultServletHolder, "/*"); HandlerList handlerList = new HandlerList(); handlerList.setHandlers(new Handler[]{context, new DefaultHandler()}); server.setHandler(handlerList); }; } }
内容的提问来源于stack exchange,提问作者pickoneusername
相关产品推荐
相关产品推荐

