wake-up-neo.com

Wie kann ich ein sekundäres Servlet bei Spring Boot registrieren?

Ich habe ein zusätzliches Servlet, das ich in meiner Anwendung registrieren muss. Mit Spring Boot und seiner Java Config kann ich jedoch nicht einfach Servlet-Zuordnungen in einer web.xml-Datei hinzufügen.

Wie kann ich zusätzliche Servlets hinzufügen?

60
checketts

Füge einfach eine Bean für das Servlet hinzu . Es wird /{beanName}/ zugeordnet.

@Bean
public Servlet foo() {
    return new FooServlet();
}
50
chrylis

Ebenfalls verfügbar ist die ServletRegistrationBean

@Bean
public ServletRegistrationBean servletRegistrationBean(){
    return new ServletRegistrationBean(new FooServlet(),"/someOtherUrl/*");
}

Das war der Weg, den ich eingeschlagen habe.

118
checketts

Sie können mehrere verschiedene Servlets mit unterschiedlichen ServletRegistrationBean wie @Bean in Application class registrieren, und Sie können ein Servlet registrieren, das mehrere Servlet-Zuordnungen hat.

   @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");
   }
19
Muzu

Wir können das Servlet auch wie folgt registrieren:

@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);
  }
}
4
Pramod Yadav

Wenn Sie einen eingebetteten Server verwenden, können Sie Ihre Servlet-Klasse mit @WebServlet kommentieren:

@WebServlet(urlPatterns = "/example")
public class ExampleServlet extends HttpServlet

Von @WebServlet :

Anmerkung zum Deklarieren eines Servlets.

Diese Anmerkung wird vom Container zum Zeitpunkt der Bereitstellung verarbeitet, und das entsprechende Servlet, das unter der angegebenen URL verfügbar ist Muster.

Und aktivieren Sie @ServletComponentScan für eine Basisklasse:

@ServletComponentScan
@EntityScan(basePackageClasses = { ExampleApp.class, Jsr310JpaConverters.class })
@SpringBootApplication
public class ExampleApp 

Bitte beachten Sie, dass @ServletComponentScan nur mit eingebetteten Servern funktioniert:

Aktiviert die Suche nach Servlet-Komponenten (Filter, Servlets und Listener). Das Scannen wird nur bei Verwendung eines eingebetteten Webs durchgeführt Server.

Weitere Informationen: Die @ServletComponentScan-Anmerkung in Spring Boot

1
Justas

Dieser Weg funktionierte für mich mit einem Servlet namens WS01455501EndpointFor89

@Bean
public ServletRegistrationBean<WS01455501EndpointFor89> servletRegistrationBeanAlt(ApplicationContext context) {
    ServletRegistrationBean<WS01455501EndpointFor89> servletRegistrationBean = new ServletRegistrationBean<>(new WS01455501EndpointFor89(),
            "/WS01455501Endpoint");
    servletRegistrationBean.setLoadOnStartup(1);
    return servletRegistrationBean;
}
0
cequattro

Auch im BeanDefinitionRegistryPostProcessor verfügbar

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) {
    }
}
0
BaiJiFeiLong