У меня есть дополнительный сервлет, который мне нужно зарегистрировать в моем приложении. Однако с помощью Spring Boot и его Java Config я не могу просто добавлять сопоставления сервлета в файл web.xml.
Как добавить дополнительные сервлеты?
У меня есть дополнительный сервлет, который мне нужно зарегистрировать в моем приложении. Однако с помощью Spring Boot и его Java Config я не могу просто добавлять сопоставления сервлета в файл web.xml.
Как добавить дополнительные сервлеты?
 Просто добавьте бин для сервлета. Он будет сопоставлен с /{beanName}/.
@Bean
public Servlet foo() {
    return new FooServlet();
}
		Также доступен ServletRegistrationBean
@Bean
public ServletRegistrationBean servletRegistrationBean(){
    return new ServletRegistrationBean(new FooServlet(),"/someOtherUrl/*");
}
Который оказался тем, что я сделал.
Вы можете зарегистрировать несколько разных сервлетов с различными параметрами ServletRegistrationBean, например @ Bean в классе Application, и вы можете зарегистрировать сервлет, имеющий множественное отображение сервлетов;
   @Bean
   public ServletRegistrationBean axisServletRegistrationBean() {
      ServletRegistrationBean registration = new ServletRegistrationBean(new AxisServlet(), "/services/*");
      registration.addUrlMappings("*.jws");
      return registration;
   }
   @Bean
   public ServletRegistrationBean adminServletRegistrationBean() {
      return new ServletRegistrationBean(new AdminServlet(), "/servlet/AdminServlet");
   }
		Мы также можем зарегистрировать Servlet следующим образом:
@Configuration
public class ConfigureWeb implements ServletContextInitializer, EmbeddedServletContainerCustomizer {
  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
      registerServlet(servletContext);
  }
  private void registerServlet(ServletContext servletContext) {
      log.debug("register Servlet");
      ServletRegistration.Dynamic serviceServlet = servletContext.addServlet("ServiceConnect", new ServiceServlet());
      serviceServlet.addMapping("/api/ServiceConnect/*");
      serviceServlet.setAsyncSupported(true);
      serviceServlet.setLoadOnStartup(2);
  }
}
		 Если вы используете встроенный сервер, вы можете аннотировать с помощью @WebServlet свой класс сервлета:
@WebServlet(urlPatterns = "/example")
public class ExampleServlet extends HttpServlet
 От @WebServlet:
Аннотация используется для объявления сервлета.
Эта аннотация обрабатывается контейнером во время развертывания, и соответствующий сервлет предоставляется по указанным шаблонам URL.
 И включите @ServletComponentScan для базового класса:
@ServletComponentScan
@EntityScan(basePackageClasses = { ExampleApp.class, Jsr310JpaConverters.class })
@SpringBootApplication
public class ExampleApp 
 Обратите внимание, что @ServletComponentScan будет работать только со встроенным сервером:
Включает сканирование компонентов сервлета (фильтры, сервлеты и прослушиватели). Сканирование выполняется только при использовании встроенного веб-сервера.
Дополнительная информация: аннотация @ServletComponentScan в Spring Boot
Также доступно в BeanDefinitionRegistryPostProcessor
package bj;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@SpringBootApplication
class App implements BeanDefinitionRegistryPostProcessor {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        registry.registerBeanDefinition("myServlet", new RootBeanDefinition(ServletRegistrationBean.class,
                () -> new ServletRegistrationBean<>(new HttpServlet() {
                    @Override
                    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
                        resp.getWriter().write("hello world");
                    }
                }, "/foo/*")));
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    }
}
		Этот способ работал для меня, имея сервлет с именем WS01455501EndpointFor89
@Bean
public ServletRegistrationBean<WS01455501EndpointFor89> servletRegistrationBeanAlt(ApplicationContext context) {
    ServletRegistrationBean<WS01455501EndpointFor89> servletRegistrationBean = new ServletRegistrationBean<>(new WS01455501EndpointFor89(),
            "/WS01455501Endpoint");
    servletRegistrationBean.setLoadOnStartup(1);
    return servletRegistrationBean;
}