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?
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>
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:
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 leWEB-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).
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.