2011-11-04 13 views
7

Estoy tratando de ejecutar dos clases de Servlet en un único web.xml pero no funciona, cada clase de servlet funciona bien de forma independiente.Agregar múltiples servlets en un único web.xml

web.xml:

<servlet> 
    <servlet-name>spring-ws</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>spring-ws</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<session-config> 
    <session-timeout>240</session-timeout> 
</session-config> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring-ws-servlet.xml 
    /WEB-INF/health-page-servlet.xml</param-value> 
</context-param> 

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

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

<servlet-mapping> 
    <servlet-name>health-page</servlet-name> 
    <url-pattern>/health.htm</url-pattern> 
</servlet-mapping> 

hágamelo saber si puede averiguar algo malo que estoy haciendo.

He probado el siguiente enlace pero no funciona para mí Can I use Spring MVC and Spring WS in one single application?

+0

La declaración servlet falta para sus "primavera-ws" servlet – r0ast3d

Respuesta

5

Esto no va a funcionar. El que está mapeado en /* supera a todas las solicitudes. En su lugar, debe asignarlo en / para que solo intercepte las solicitudes que no coincidan con todos los demás servlets existentes (incluido el servlet JSP que está implícitamente mapeado en *.jsp y todos los recursos estáticos "normales" como archivos CSS/JS/image !). Consulte también Difference between/and /* in servlet mapping url pattern.

Si también es necesario poder servir recursos estáticos, entonces mejor asócielos en un patrón de URL más específico como /ws/* y cree un Filter que verifique el URI de solicitud y luego remita en consecuencia. Ese filtro, a su vez, puede mapearse de manera segura en /*. Ver también esta respuesta para un ejemplo de código más concreto: How to access static resources when mapping a global front controller servlet on /*.

+0

Pensé que las asignaciones se usarían de la mayoría a la menos específica. –

+0

@Dave: No si hay un '/ *'. Tal mapeo solo debe usarse en filtros. – BalusC

+0

Entonces, ¿eso se considera diferente de una coincidencia de directorio, como/foo/*? –

0

usted tiene una asignación para/* en la sección de primavera-ws que está recibiendo la petición. necesita proponer una estrategia diferente ... Intente poner /health.htm antes del mapeo/*.

+2

El orden de especificación no es relevante . –

2

estoy usando la configuración de Java en mi proyecto y el siguiente código funciona bien con el mismo propósito:

public class Initializer implements WebApplicationInitializer { 

    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(ApplicationConfiguration.class); 
     ctx.setServletContext(servletContext); 

     MessageDispatcherServlet messageDispatcherServlet = new MessageDispatcherServlet(); 
     messageDispatcherServlet.setApplicationContext(ctx); 
     messageDispatcherServlet.setTransformWsdlLocations(true); 
     Dynamic dynamic = servletContext.addServlet("messageDispatcherServlet", messageDispatcherServlet); 
     dynamic.addMapping("/ws/*"); 
     dynamic.setLoadOnStartup(1); 

     dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     dynamic.addMapping("/"); 
     dynamic.setLoadOnStartup(1); 
    } 
} 
Cuestiones relacionadas