web-dev-qa-db-fra.com

DispatcherServlet et web.xml dans Spring Boot

J'essaie actuellement de déplacer mon projet de Java EE vers un projet Spring Boot. Cependant, j'ai été bloqué et confus de part avec servlet et web.xml dispatcher et il semble que Web Le projet ne lit plus le fichier .xml, celui-ci est exécuté sur Tomcat 7.

Dans mon web.xml fichier, j'ai beaucoup de servlet, servlet-mapping, filter et filter mapping et je ne comprends pas vraiment comment faire le mappage dans le répartiteur.

J'ai joint un échantillon de mon web.xml ci-dessous et la version est 2.5.

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>displayName</display-name>
  <description>description</description>
  <resource-ref>
    ...
  </resource-ref>
  <filter>
    <filter-name>Some Filter Name</filter-name>
    <filter-class>Some Filter Class</filter-class>
    <init-param>
      <param-name>Some Param Name</param-name>
      <param-value>Some Value</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Some Filter Name</filter-name>
    <url-pattern>Some url-pattern</url-pattern>
  </filter-mapping>
  <context-param>
    <param-name>Some Param Name</param-name>
    <param-value>Some Param Value</param-value>
  </context-param>
  <servlet>
    <servlet-name>Some Servlet Name</servlet-name>
    <servlet-class>Some Servlet Class</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Some Servlet Name</servlet-name>
    <url-pattern>Some Url Pattern</url-pattern>
  </servlet-mapping>
</web-app>

Qns:

  1. Devrais-je convertir tout ce qui se trouve dans mon web.xml compter sur le répartiteur de printemps, si oui, comment puis-je y parvenir?
  2. S'éloigne du web.xml la voie à suivre pour le projet de démarrage du printemps?

Quelqu'un peut-il me guider s'il vous plaît ici? Merci!!

23
NatureWonder
  1. Oui, Spring Boot ne relais plus sur la configuration XML et configure automatiquement un équivalent au servlet de répartiteur. Vous pouvez suivre le lien suivant pour savoir comment enregistrer vos filtres: Comment ajouter une classe de filtre dans Spring Boot?
  2. Si vous utilisez maven et non gradle, le seul code XML de votre projet de démarrage printanier devrait être pom.xml. Le chemin à parcourir avec Spring Boot consiste à déplacer toute votre configuration XML, web.xml, etc. vers la configuration automatique de Spring Boot + votre configuration Java).

Le démarrage de printemps fonctionne très bien lorsque vous faites tout dans Java configuration et suivez ses principes. D'après mon expérience, lorsque vous commencez à fusionner la configuration XML et le ressort hérité, il commence à briser le processus de configuration automatique et C’est beaucoup mieux d’essayer autant que possible de se conformer aux nouvelles pratiques de démarrage printanières.

20
Tom
  1. Vous pouvez garder votre web.xml, mais il faut ajouter

    <listener>
         <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
    </listener> 
    

    dans web.xml. Et, dépendance requise de pom.xml.

  2. Toutes les classes d'écoute, les filtres sont convertis en Java. Cette classe serait @Configuration.

  3. Si vous avez un intercepteur, celui-ci peut être déplacé vers la classe de configuration.

4
Md Jalal

Spring-boot préfère les annotations aux configurations basées sur xml , donc dans votre cas, au lieu d'utiliser web.xml pour configurer le servlet, servlet-mapping, filter et filter mapping, vous pouvez utiliser des créations automatiques de beans basées sur des annotations pour enregistrer des beans.Pour que vous deviez:

  • Convertir les mappages xml en mappages basés sur des annotations
  • Créer des haricots en utilisant @Bean annotations pour que spring-boot les prenne automatiquement en charge lors de l’analyse des composants.

Pour référence: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html

  • Pour enregistrer des filtres et ajouter des beans de filtre , vous pouvez créer une classe et l'annoter avec le @Configuration ou @Component annotation et créer le haricot de FilterRegistrationBean pour enregistrer le filtre. Vous pouvez également créer les haricots du filtre lui-même en utilisant l'annotation @Bean.

Par exemple, l’équivalent du filtre XML suivant

<filter>
  <filter-name>SomeUrlFilter</filter-name>
   <filter-class>com.company.SomeUrlFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SomeUrlFilter</filter-name>
    <url-pattern>/url/*</url-pattern>
    <init-param>
       <param-name>paramName</param-name>
       <param-value>paramValue</param-value>
    </init-param>
</filter-mapping>

Les annotations équivalentes seront:

@Bean
public FilterRegistrationBean someUrlFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(someUrlFilter());
    registration.addUrlPatterns("/url/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("Filter");
    registration.setOrder(1);
    return registration;
} 

@Bean(name = "someUrlFilter")
public Filter someUrlFilter() {
    return new SomeUrlFilter();
}
  • Springboot nous permet toujours d’utiliser les configurations basées sur XML par exemple si vous voulez utiliser le web.xml .Par exemple :

Web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

et dans un autre fichier dispatcher.xml vous pouvez créer des beans en tant que:

<beans ...>

    <context:component-scan base-package="com.demo"/>

    <bean
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

Notez que Spring web.xml vivra généralement à src/main/webapp/WEB-INF.

Vous pouvez vous référer: https://www.baeldung.com/register-servlet

1
Ananthapadmanabhan

J'ai passé assez de temps à partager trois choses dont je me souviens pour que tout fonctionne à partir d'une ligne de commande.

  1. Le plus important: les fichiers JSP doivent être conservés uniquement dans le dossier/src/main/resources/META-INF/resources. plus d'infos ici
  2. Assurez-vous que maven lors de la construction de jar considère vos dossiers/src/main/resources, sinon ajoutez ces lignes dans votre pom.xml
  <resources>
     <resource>
        <directory>src/main/resources</directory>   
      </resource>
    </resources>
  1. Dans votre fichier de configuration MVC

    @Configuration public class MvcConfig étend WebMvcConfigurerAdapter {@Bean public InternalResourceViewResolver viewResolver () {InternalResourceViewResolver resolver = new InternalResourceViewResolver (); resolver.setPrefix ("/ Representation /"); resolver.setSuffix (". jsp"); retour résolveur; }

0
Vikky