web-dev-qa-db-fra.com

Comment puis-je enregistrer un servlet secondaire avec Spring Boot?

J'ai un servlet supplémentaire que je dois enregistrer dans mon application. Cependant, avec Spring Boot et sa configuration Java, je ne peux pas simplement ajouter des mappages de servlets dans un fichier web.xml.

Comment puis-je ajouter des servlets supplémentaires?

60
checketts

Il suffit d'ajouter un haricot pour le servlet . Il sera mis en correspondance avec /{beanName}/.

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

Aussi disponible est la ServletRegistrationBean

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

Ce qui a fini par être le chemin que j'ai pris.

118
checketts

Vous pouvez enregistrer plusieurs servlets différents avec différents ServletRegistrationBean, comme @Bean dans la classe Application, et vous pouvez enregistrer un servlet doté de plusieurs mappages de servlets.

   @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

Nous pouvons également enregistrer le Servlet comme suit:

@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

Si vous utilisez un serveur intégré, vous pouvez annoter avec @WebServlet votre classe de servlet:

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

De @WebServlet :

Annotation utilisée pour déclarer un servlet.

Cette annotation est traitée par le conteneur au moment du déploiement et la servlet correspondante mise à disposition à l'URL spécifiée modèles.

Et activez @ServletComponentScan sur une classe de base:

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

Veuillez noter que @ServletComponentScan fonctionnera uniquement avec le serveur intégré:

Active l'analyse des composants Servlet (filtres, servlets et écouteurs ). La numérisation n’est effectuée que si vous utilisez un site Web intégré serveur.

Plus d'informations: L'annotation @ServletComponentScan dans Spring Boot

1
Justas

Cette manière a fonctionné pour moi, ayant un servlet appelé WS01455501EndpointFor89

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

Egalement disponible dans le 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) {
    }
}
0
BaiJiFeiLong