From 741aa3b8fe65c05ca1ebbaf14c107f4604aaca88 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Wed, 4 Apr 2007 09:25:26 +0000 Subject: [PATCH] Fixed #SWS-103: MessageDispatcherServlet does not transform WSDL locations --- .../http/MessageDispatcherServlet.java | 68 +++++++++---------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java b/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java index d0638393..e7729c94 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java +++ b/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java @@ -12,26 +12,31 @@ import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.core.io.ClassPathResource; +import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.FrameworkServlet; import org.springframework.web.util.WebUtils; import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.server.EndpointAdapter; +import org.springframework.ws.server.EndpointExceptionResolver; +import org.springframework.ws.server.EndpointMapping; +import org.springframework.ws.server.MessageDispatcher; import org.springframework.ws.transport.WebServiceMessageReceiver; import org.springframework.ws.transport.support.DefaultStrategiesHelper; import org.springframework.ws.wsdl.WsdlDefinition; /** - * Servlet for simplified dispatching of Web service messages. Delegates to a MessageDispatcher and a - * WebServiceMessageReceiverHandlerAdapter. + * Servlet for simplified dispatching of Web service messages. This servlet is a convenient alternative for a standard + * Spring-MVC {@link DispatcherServlet} with a separate {@link WebServiceMessageReceiverHandlerAdapter} and a {@link + * MessageDispatcher}, and a {@link WsdlDefinitionHandlerAdapter}. *

- * This servlet is a convenient alternative for a standard Spring-MVC DispatcherServlet with a separate - * WebServiceMessageReceiverHandlerAdapter and a MessageDispatcher. + * This servlet automatically detects {@link EndpointAdapter}s, {@link EndpointMapping}s, and {@link + * EndpointExceptionResolver}s by type. *

- * This servlet automatically detects EndpointAdapters, EndpointMappings, and - * EndpointExceptionResolvers, by type (when the corresponding detectAll* property is enabled) or by type - * (when the property is disabled). For instance, when the detectAllEndpointAdapters propery is - * true (the default), all endpoint adapters defined in the web application context are registered with the - * message dispatcher. When it is set to false, this servlet tries to find a bean with the - * "endpointAdapter" bean name in the context. + * This servlet also automatically detects any {@link WsdlDefinition} in its application context. This WSDL is exposed + * under the bean name (e.g. a {@link WsdlDefinition} bean named 'echo' will be exposed as + * echo.wsdl in this servlet's context: http://localhost:8080/spring-ws/echo.wsdl). When the + * transformWsdlLocations property is set to true in the web.xml, all location + * attributes in the WSDL definitions will reflect the URL of the incoming request. * * @author Arjen Poutsma * @see org.springframework.web.servlet.DispatcherServlet @@ -40,14 +45,10 @@ import org.springframework.ws.wsdl.WsdlDefinition; */ public class MessageDispatcherServlet extends FrameworkServlet { - /** - * Well-known name for the WebServiceMessageFactory object in the bean factory for this namespace. - */ + /** Well-known name for the WebServiceMessageFactory object in the bean factory for this namespace. */ public static final String WEB_SERVICE_MESSAGE_FACTORY_BEAN_NAME = "messageFactory"; - /** - * Well-known name for the WebServiceMessageReceiver object in the bean factory for this namespace. - */ + /** Well-known name for the WebServiceMessageReceiver object in the bean factory for this namespace. */ public static final String MESSAGE_RECEIVER_BEAN_NAME = "messageReceiver"; /** @@ -56,45 +57,41 @@ public class MessageDispatcherServlet extends FrameworkServlet { */ private static final String DEFAULT_STRATEGIES_PATH = "MessageDispatcherServlet.properties"; - /** - * Suffix of a WSDL request uri. - */ + /** Suffix of a WSDL request uri. */ private static final String WSDL_SUFFIX_NAME = ".wsdl"; private final DefaultStrategiesHelper defaultStrategiesHelper; - /** - * The WebServiceMessageReceiverHandlerAdapter used by this servlet. - */ + /** The WebServiceMessageReceiverHandlerAdapter used by this servlet. */ private WebServiceMessageReceiverHandlerAdapter messageReceiverHandlerAdapter = new WebServiceMessageReceiverHandlerAdapter(); - /** - * The WsdlDefinitionHandlerAdapter used by this servlet. - */ + /** The WsdlDefinitionHandlerAdapter used by this servlet. */ private WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter(); - /** - * The WebServiceMessageReceiver used by this servlet. - */ + /** The WebServiceMessageReceiver used by this servlet. */ private WebServiceMessageReceiver messageReceiver; - /** - * Keys are bean names, values are WsdlDefinitions. - */ + /** Keys are bean names, values are WsdlDefinitions. */ private Map wsdlDefinitions; - /** - * Public constructor, necessary for some Web application servers. - */ + private boolean transformWsdlLocations = false; + + /** Public constructor, necessary for some Web application servers. */ public MessageDispatcherServlet() { defaultStrategiesHelper = new DefaultStrategiesHelper( new ClassPathResource(DEFAULT_STRATEGIES_PATH, MessageDispatcherServlet.class)); } /** - * Returns the WebServiceMessageReceiver used by this servlet. + * Sets whether relative address locations in the WSDL are to be transformed using the request URI of the incoming + * HttpServletRequest. Defaults to false. */ + public void setTransformWsdlLocations(boolean transformWsdlLocations) { + this.transformWsdlLocations = transformWsdlLocations; + } + + /** Returns the WebServiceMessageReceiver used by this servlet. */ protected WebServiceMessageReceiver getMessageReceiver() { return messageReceiver; } @@ -190,6 +187,7 @@ public class MessageDispatcherServlet extends FrameworkServlet { } private void initWsdlDefinitions() { + wsdlDefinitionHandlerAdapter.setTransformLocations(transformWsdlLocations); // Find all WsdlDefinitions in the ApplicationContext, incuding ancestor contexts. wsdlDefinitions = BeanFactoryUtils .beansOfTypeIncludingAncestors(getWebApplicationContext(), WsdlDefinition.class, true, false);