I created a Servlet (extending from HttpServlet) and annotated as per 3.0 specs with
@WebServlet(name="DelegateServiceExporter", urlPatterns={"/remoting/DelegateService"})
My @Configuration
class in Spring Boot scans this servlet's package. However, it does not log that it has deployed this servlet in the embedded Tomcat 8.0.15 container when my Spring Boot application starts up.
So, I added @Component
to my servlet as well. Now, Spring Boot registers the servlet (proving to me that the scan package was correctly set up), but then it registers it with a URL pattern based on a class name using camel case. So, that was better - e.g., I got a servlet registered, but with the wrong URL mappings!
2015-01-05 11:29:08,516 INFO (localhost-startStop-1) [org.springframework.boot.context.embedded.ServletRegistrationBean] Mapping servlet: 'delegateServiceExporterServlet' to [/delegateServiceExporterServlet/]
How do I get Spring Boot to auto-load all @WebServlet
annotated servlets and honor their url mappings?
Add @ServletComponentScan
in your bootstrap class.
such as
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
This will enable spring boot to scan @WebServlet
as well as @WebListener
.
With Spring Boot, you should use the ServletRegistrationBean
object instead of the @WebServlet
annotation if you want to register a Servlet and provide the URL pattern.
Adding this bean to your @Configuration
class should do the trick :
@Bean
public ServletRegistrationBean delegateServiceExporterServlet() {
return new ServletRegistrationBean(new DelegateServiceExporter(), "/remoting/DelegateService");
}
It's possible to load servlets annotated with @WebServlet
and their mappings in Spring Boot. To do this you need to use @ServletComponentScan
with @Configuration
annotation. This also works for @WebFilter
and @WebListener
annotations.
来源:https://stackoverflow.com/questions/27785935/spring-boot-does-not-honor-webservlet