14

我创建了一个 Servlet(从 HttpServlet 扩展)并按照 3.0 规范进行了注释

@WebServlet(name="DelegateServiceExporter", urlPatterns={"/remoting/DelegateService"})

@Configuration在 Spring Boot 中的课程扫描了这个 servlet 的包。但是,当我的 Spring Boot 应用程序启动时,它不会记录它已经在嵌入式 Tomcat 8.0.15 容器中部署了这个 servlet。

所以,我也添加@Component到我的 servlet 中。现在,Spring Boot 注册 servlet(向我证明扫描包已正确设置),但随后它使用基于类名的 URL 模式注册它,使用驼峰式大小写。所以,这样更好 - 例如,我注册了一个 servlet,但 URL 映射错误!

2015-01-05 11:29:08,516 INFO  (localhost-startStop-1) [org.springframework.boot.context.embedded.ServletRegistrationBean] Mapping servlet: 'delegateServiceExporterServlet' to [/delegateServiceExporterServlet/]

如何让 Spring Boot 自动加载所有带@WebServlet注释的 servlet 并尊重它们的 url 映射?

4

3 回答 3

42

添加@ServletComponentScan你的引导类。

@SpringBootApplication
@ServletComponentScan 
public class Application {
   public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
   }
}

这将使 spring boot 能够扫描@WebServlet以及@WebListener.

于 2016-09-08T07:58:48.353 回答
6

使用 Spring Boot,如果要注册 Servlet 并提供 URL 模式,则应使用ServletRegistrationBean对象而不是注解。@WebServlet

将此 bean 添加到您的@Configuration课程中应该可以解决问题:

@Bean
public ServletRegistrationBean delegateServiceExporterServlet() {
    return new ServletRegistrationBean(new DelegateServiceExporter(), "/remoting/DelegateService");
}
于 2015-01-05T21:32:12.480 回答
4

可以在 Spring Boot 中加载带有注释的 servlet@WebServlet及其映射。为此,您需要使用@ServletComponentScanwith @Configurationannotation。这也适用于@WebFilter@WebListener注释。

于 2016-05-27T12:19:21.843 回答