Spring Boot не соблюдает @WebServlet

Я создал сервлет (расширенный из HttpServlet) и аннотировал его в соответствии со спецификациями 3.0 с помощью

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

Мой класс @Configuration в Spring Boot сканирует пакет этого сервлета. Однако он не регистрирует развертывание этого сервлета во встроенном контейнере Tomcat 8.0.15 при запуске моего приложения Spring Boot.

Итак, я также добавил @Component в свой сервлет. Теперь Spring Boot регистрирует сервлет (доказывая мне, что пакет сканирования был правильно настроен), но затем регистрирует его с помощью шаблона URL на основе имени класса с использованием верблюжьего регистра. Итак, это было лучше - например, я зарегистрировал сервлет, но с неправильным отображением 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 и учитывать их сопоставления URL-адресов?


person Jason    schedule 05.01.2015    source источник
comment
Вы не знаете. Spring Boot использует другой способ настройки и сопоставления сервлетов.   -  person M. Deinum    schedule 05.01.2015
comment
Я открыл вопрос, чтобы обсудить возможность соблюдения @WebServlet.   -  person Andy Wilkinson    schedule 06.01.2015
comment
Я получил это работает с советом здесь. Всем спасибо! Я не смог найти, где в документации Spring Boot говорится, что она не поддерживает аннотацию WebServlet, поэтому я был сбит с толку. Если я пропустил документ, пожалуйста, дайте мне знать, где он написан. В противном случае было бы полезно хотя бы обновить документацию Spring Boot — например, прямо сказать, что аннотация WebServlet не поддерживается. :)   -  person Jason    schedule 06.01.2015


Ответы (3)


Добавьте @ServletComponentScan в свой класс начальной загрузки.

Такие как

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

Это позволит весенней загрузке сканировать @WebServlet, а также @WebListener.

person David Ding    schedule 08.09.2016
comment
Это должен быть принятый ответ. Ты лучший! - person ForNeVeR; 03.01.2017
comment
(AT)WebServlet — это аннотация JEE; таким образом, он подхватывается только тогда, когда указано (AT)ServletComponentScan. Последнее представляет собой инструкцию по поиску аннотаций JEE. - person Steve11235; 08.05.2018
comment
Я рекомендую указать (a) пакеты Java, чтобы избежать сканирования всего дерева зависимостей; например, @ServletComponentScan(org.my.project.servlet) - person chrisinmtown; 17.07.2019

С Spring Boot вы должны использовать объект ServletRegistrationBean вместо аннотации @WebServlet, если вы хотите зарегистрировать сервлет и указать шаблон URL.

Добавление этого bean-компонента в ваш класс @Configuration должно помочь:

@Bean
public ServletRegistrationBean delegateServiceExporterServlet() {
    return new ServletRegistrationBean(new DelegateServiceExporter(), "/remoting/DelegateService");
}
person Jean-Philippe Bond    schedule 05.01.2015

В Spring Boot можно загружать сервлеты, аннотированные @WebServlet, и их сопоставления. Для этого вам нужно использовать @ServletComponentScan с аннотацией @Configuration. Это также работает для аннотаций @WebFilter и @WebListener.

person user3007501    schedule 27.05.2016