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}.
*
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);