Spring Boot不遵守@WebServlet注解

16

我创建了一个Servlet(继承自HttpServlet),并按照3.0规范进行了注释

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

我在Spring Boot中的@Configuration类中扫描了这个Servlet所在的包。但是,当我的Spring Boot应用程序启动时,它并没有记录它已经将这个Servlet部署到嵌入式Tomcat 8.0.15容器中。

因此,我也将@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映射?


你不需要这样做。Spring Boot使用一种不同的配置和映射servlet的方式。 - M. Deinum
1
我已经开了一个问题来讨论是否可以尊重 @WebServlet。问题链接为:https://github.com/spring-projects/spring-boot/issues/2290 - Andy Wilkinson
1
我已经按照这里的建议解决了问题。谢谢大家!我没有找到Spring Boot文档中说明不支持WebServlet注释的地方,所以我感到困惑。如果我错过了文档,请告诉我在哪里写了。否则,更新Spring Boot文档将会很有帮助 - 例如,明确说明不支持WebServlet注释。 :) - Jason
3个回答

47

在你的引导类中添加@ServletComponentScan

例如:

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

这将使Spring Boot能够扫描@WebServlet@WebListener


1
那应该是被接受的答案。你最棒了! - ForNeVeR
(AT)WebServlet 是一个 JEE 注解,因此只有在指定 (AT)ServletComponentScan 时才会被捕获。后者是一个扫描 JEE 注解的指令。 - Steve11235
2
我建议指定一个或多个Java包以避免扫描整个依赖树;例如,@ServletComponentScan("org.my.project.servlet")。 - chrisinmtown

7
使用Spring Boot时,如果您想注册Servlet并提供URL模式,则应使用ServletRegistrationBean对象而不是@WebServlet注释。将此bean添加到您的@Configuration类中即可解决问题:
@Bean
public ServletRegistrationBean delegateServiceExporterServlet() {
    return new ServletRegistrationBean(new DelegateServiceExporter(), "/remoting/DelegateService");
}

5

在Spring Boot中,可以加载带有@WebServlet注释以及它们的映射。要做到这一点,您需要使用@ServletComponentScan@Configuration注释。这也适用于@WebFilter@WebListener注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接