Comment enregistrer plusieurs servlets dans web.xml dans une application Spring
Question
Je veux définir deux servlets dans mon web.xml de printemps - un pour l'application des pages html / jsp, et un pour un service Web qui sera appelée 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 je myservlet utiliser le DispatcherServlet dans le fichier lui-même, il fonctionne très bien. Si je l'utilisateur-webservice avec le contexte param pour son fichier de configuration (utilisateur-service servlet.xml), il fonctionne très bien. Cependant, si j'ai à la fois dans le fichier, le myservlet ne fonctionne pas comme le fichier myservlet-servlet.xml est pas chargé automatiquement. Si je supprime le contexte param, puis les travaux de myServlet, mais l'utilisateur-webservice ne fonctionne pas comme il est le fichier de configuration (utilisateur-service servlet.xml) n'est pas chargé.
Comment puis-je avoir à la fois servlets définis et leurs deux fichiers de configuration chargés?
La solution
Comme expliqué dans ce fil sur la liste de diffusion CxF-utilisateur, plutôt que d'avoir la CXFServlet charge son propre contexte de printemps de user-webservice-servlet.xml
, vous pouvez simplement charger le tout dans le contexte racine. Renommez votre user-webservice-servlet.xml
existant à un autre nom (par exemple user-webservice-beans.xml
) puis modifiez votre paramètre contextConfigLocation
à 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>
Autres conseils
Utilisez quelque chose config 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>
et alors vous aurez besoin de trois fichiers:
- applicationContext.xml;
- myservlet-servlet.xml; et
- utilisateur webservice-servlet.xml.
Les fichiers *-servlet.xml
sont automatiquement utilisés et chacun crée un contexte d'application pour cette servlet.
De la documentation du printemps, 13.2. DispatcherServlet:
Le cadre sera, lors de l'initialisation d'un
DispatcherServlet
, chercher un fichier nommé [servlet-name] -servlet.xml dans le répertoire de votreWEB-INF
web application et créer les haricots il définie (remplaçant la les définitions des haricots définies avec le même nom dans le champ global).
Je sais que c'est un peu vieux, mais la réponse courte serait