Spring Boot不尊重@WebServlet

时间:2015-01-05 18:52:51

标签: spring annotations spring-boot servlet-3.0 embedded-tomcat-8

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

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

Spring Boot中的@Configuration类扫描这个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映射?

3 个答案:

答案 0 :(得分:19)

在引导类中添加@ServletComponentScan

,例如

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

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

答案 1 :(得分:5)

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

将此bean添加到@Configuration类应该可以解决问题:

@Bean
public ServletRegistrationBean delegateServiceExporterServlet() {
    return new ServletRegistrationBean(new DelegateServiceExporter(), "/remoting/DelegateService");
}

答案 2 :(得分:2)

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