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?
Il suffit d'ajouter un haricot pour le servlet . Il sera mis en correspondance avec /{beanName}/
.
@Bean
public Servlet foo() {
return new FooServlet();
}
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.
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");
}
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);
}
}
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
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;
}
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) {
}
}