2009-12-08 9 views
26

Quiero definir dos servlets en mi Spring web.xml - uno para la aplicación html/jsp páginas, y otro para un servicio web que será llamado por un aplicación externa. Aquí está el web.xml:Cómo registrar múltiples servlets en web.xml en una aplicación de Spring

<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 tengo myservlet utilice el DispatcherServlet en el archivo por sí mismo, trabaja muy bien. Si tengo el servicio web del usuario con el parámetro contextual para su archivo de configuración (user-service-servlet.xml), funciona bien. Sin embargo, si tengo ambos en el archivo, entonces el myservlet no funciona, ya que el archivo myservlet-servlet.xml no se carga automáticamente. Si elimino el parámetro contextual, entonces el myservlet funciona, pero el servicio web del usuario no funciona, ya que su archivo de configuración (user-service-servlet.xml) no está cargado.

¿Cómo puedo tener ambos servlets definidos y cargar sus dos archivos de configuración?

Respuesta

16

Como se explica en this thread en la lista de correo cxf-usuario, en lugar de tener la CXFServlet cargar su propio contexto surgen de user-webservice-servlet.xml, sólo puede cargar todo el lote en el contexto raíz. Cambiar el nombre de su actual user-webservice-servlet.xml a algún otro nombre (por ejemplo user-webservice-beans.xml) luego cambia de parámetro contextConfigLocation a algo como:

<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> 
+1

¿Cómo puede el contexto para ambos servlets estar en contexto raíz, si se usan bases de datos separadas y otras configuraciones? ¿Cómo se distinguen entre un archivo? –

6

Uso config algo como esto:

<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> 

y entonces usted tendrá tres archivos:

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

Los archivos *-servlet.xml se utilizan automáticamente y cada uno crea un contexto de aplicación para ese servlet.

De la documentación de Primavera, 13.2. The DispatcherServlet:

El marco, en la inicialización de un DispatcherServlet, mirada de un archivo llamado [servlet-name] -servlet.xml en el directorio WEB-INF de su aplicación web y cree los beans definidos allí (anulando las definiciones de los beans definidos con del mismo nombre en el ámbito global).

+0

Esto no ayuda - Tengo esos archivos en mi aplicación, pero cuando voy a http: // localhost: 8080/MyApp/index.jsp, muestra la página, pero cuando voy a http: // localhost: 8080/MyApp (sin barra diagonal), abre el servicio web del usuario, pero al hacer clic en el enlace WSDL se muestra el mensaje "No se han encontrado servicios". Quizás mi problema es que los archivos de configuración no se están cargando, pero la asignación al servicio web no es correcta. –

1

Sé que esto es un poco viejo, pero la respuesta en corto sería < load-on-startup > tanto las ocurrencias han dado la misma identificación que es 1 dos veces. Esto puede confundir la secuencia de carga.

Cuestiones relacionadas