web-dev-qa-db-fra.com

Comment enregistrer plusieurs servlets dans web.xml dans une seule application Spring

Je veux définir deux servlets dans mon web.xml Spring - un pour les pages html/jsp de l'application, et un pour un service Web qui sera appelé par une application externe. Voici le web.xml:

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>myservlet</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/user-service-servlet.xml</param-value>
</context-param>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>user-webservice</servlet-name>
  <url-pattern>/UserService/*</url-pattern>
</servlet-mapping>

Si mon myservlet utilise le DispatcherServlet dans le fichier lui-même, cela fonctionne très bien. Si j'ai le user-webservice avec le paramètre de contexte pour son fichier de configuration (user-service-servlet.xml), cela fonctionne très bien. Cependant, si j'ai les deux dans le fichier, le myservlet ne fonctionne pas car le fichier myservlet-servlet.xml n'est pas chargé automatiquement. Si je supprime le paramètre de contexte, le myservlet fonctionne, mais l'utilisateur-webservice ne fonctionne pas car son fichier de configuration (user-service-servlet.xml) n'est pas chargé.

Comment puis-je définir les deux servlets et charger leurs deux fichiers de configuration?

27
David Buckley

Comme expliqué dans ce fil sur la liste de diffusion cxf-user, plutôt que de demander au CXFServlet de charger son propre contexte de ressort à partir de user-webservice-servlet.xml, vous pouvez simplement charger le tout dans le contexte racine. Renommez votre user-webservice-servlet.xml à un autre nom (par exemple user-webservice-beans.xml), puis changez votre paramètre contextConfigLocation en quelque chose comme:

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>myservlet</servlet-name>
  <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/applicationContext.xml
    /WEB-INF/user-webservice-beans.xml
  </param-value>
</context-param>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>user-webservice</servlet-name>
  <url-pattern>/UserService/*</url-pattern>
</servlet-mapping>
17
Pascal Thivent

Utilisez config quelque chose comme ceci:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
  <servlet-name>user-webservice</servlet-name>
  <servlet-class>org.Apache.cxf.transport.servlet.CXFServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

puis vous aurez besoin de trois fichiers:

  • applicationContext.xml;
  • myservlet-servlet.xml; et
  • user-webservice-servlet.xml.

Le *-servlet.xml les fichiers sont utilisés automatiquement et chacun crée un contexte d'application pour ce servlet.

Dans la documentation Spring, 13.2. The DispatcherServlet :

Le framework recherchera, lors de l'initialisation d'un DispatcherServlet, un fichier nommé [nom-servlet] -servlet.xml dans le WEB-INF répertoire de votre application Web et créez les beans qui y sont définis (en remplaçant les définitions de tous les beans définis avec le même nom dans la portée globale).

6
cletus

Je sais que c'est un peu vieux mais la réponse en bref serait <load-on-startup> les deux occurrences ont donné le même identifiant qui est 1 deux fois. Cela peut confondre la séquence de chargement.

1
Tony Shih