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 b04e3509..a911fe02 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 @@ -16,6 +16,7 @@ package org.springframework.ws.transport.http; +import java.util.Iterator; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -70,6 +71,15 @@ public class MessageDispatcherServlet extends FrameworkServlet { /** Well-known name for the {@link WebServiceMessageReceiver} object in the bean factory for this namespace. */ public static final String DEFAULT_MESSAGE_RECEIVER_BEAN_NAME = "messageReceiver"; + /** + * Well-known name for the {@link WebServiceMessageReceiverHandlerAdapter} object in the bean factory for this + * namespace. + */ + public static final String DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME = "messageReceiverHandlerAdapter"; + + /** Well-known name for the {@link WsdlDefinitionHandlerAdapter} object in the bean factory for this namespace. */ + public static final String DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME = "wsdlDefinitionHandlerAdapter"; + /** * Name of the class path resource (relative to the {@link MessageDispatcherServlet} class) that defines * MessageDispatcherServlet's default strategy names. @@ -83,12 +93,15 @@ public class MessageDispatcherServlet extends FrameworkServlet { private String messageFactoryBeanName = DEFAULT_MESSAGE_FACTORY_BEAN_NAME; + private String messageReceiverHandlerAdapterBeanName = DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME; + /** The {@link WebServiceMessageReceiverHandlerAdapter} used by this servlet. */ - private WebServiceMessageReceiverHandlerAdapter messageReceiverHandlerAdapter = - new WebServiceMessageReceiverHandlerAdapter(); + private WebServiceMessageReceiverHandlerAdapter messageReceiverHandlerAdapter; + + private String wsdlDefinitionHandlerAdapterBeanName = DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME; /** The {@link WsdlDefinitionHandlerAdapter} used by this servlet. */ - private WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter(); + private WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter; private String messageReceiverBeanName = DEFAULT_MESSAGE_RECEIVER_BEAN_NAME; @@ -140,6 +153,32 @@ public class MessageDispatcherServlet extends FrameworkServlet { return transformWsdlLocations; } + /** Returns the bean name used to lookup a {@link WebServiceMessageReceiverHandlerAdapter}. */ + public String getMessageReceiverHandlerAdapterBeanName() { + return messageReceiverHandlerAdapterBeanName; + } + + /** + * Sets the bean name used to lookup a {@link WebServiceMessageReceiverHandlerAdapter}. Defaults to {@link + * #DEFAULT_MESSAGE_RECEIVER_HANDLER_ADAPTER_BEAN_NAME}. + */ + public void setMessageReceiverHandlerAdapterBeanName(String messageReceiverHandlerAdapterBeanName) { + this.messageReceiverHandlerAdapterBeanName = messageReceiverHandlerAdapterBeanName; + } + + /** Returns the bean name used to lookup a {@link WsdlDefinitionHandlerAdapter}. */ + public String getWsdlDefinitionHandlerAdapterBeanName() { + return wsdlDefinitionHandlerAdapterBeanName; + } + + /** + * Sets the bean name used to lookup a {@link WsdlDefinitionHandlerAdapter}. Defaults to {@link + * #DEFAULT_WSDL_DEFINITION_HANDLER_ADAPTER_BEAN_NAME}. + */ + public void setWsdlDefinitionHandlerAdapterBeanName(String wsdlDefinitionHandlerAdapterBeanName) { + this.wsdlDefinitionHandlerAdapterBeanName = wsdlDefinitionHandlerAdapterBeanName; + } + /** * Sets whether relative address locations in the WSDL are to be transformed using the request URI of the incoming * {@link HttpServletRequest}. Defaults to false. @@ -160,7 +199,8 @@ public class MessageDispatcherServlet extends FrameworkServlet { } protected void initFrameworkServlet() throws ServletException, BeansException { - initHandlerAdapters(); + initMessageReceiverHandlerAdapter(); + initWsdlDefinitionHandlerAdapter(); initMessageReceiver(); initWsdlDefinitions(); } @@ -200,23 +240,25 @@ public class MessageDispatcherServlet extends FrameworkServlet { } } - private void initHandlerAdapters() throws BeansException { + private void initMessageReceiverHandlerAdapter() { try { - // setup the receiver adapter - messageReceiverHandlerAdapter = new WebServiceMessageReceiverHandlerAdapter(); + try { + messageReceiverHandlerAdapter = (WebServiceMessageReceiverHandlerAdapter) getWebApplicationContext() + .getBean(getMessageReceiverHandlerAdapterBeanName(), + WebServiceMessageReceiverHandlerAdapter.class); + } + catch (NoSuchBeanDefinitionException ignored) { + messageReceiverHandlerAdapter = new WebServiceMessageReceiverHandlerAdapter(); + } initWebServiceMessageFactory(); messageReceiverHandlerAdapter.afterPropertiesSet(); - // setup the wsdl adapter - wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter(); - wsdlDefinitionHandlerAdapter.setTransformLocations(isTransformWsdlLocations()); - wsdlDefinitionHandlerAdapter.afterPropertiesSet(); } catch (Exception ex) { - throw new BeanInitializationException("Could not initialize handler adapters", ex); + throw new BeanInitializationException("Could not initialize WebServiceMessageReceiverHandlerAdapter", ex); } } - private void initWebServiceMessageFactory() throws Exception { + private void initWebServiceMessageFactory() { WebServiceMessageFactory messageFactory; try { messageFactory = (WebServiceMessageFactory) getWebApplicationContext() @@ -232,6 +274,24 @@ public class MessageDispatcherServlet extends FrameworkServlet { messageReceiverHandlerAdapter.setMessageFactory(messageFactory); } + private void initWsdlDefinitionHandlerAdapter() { + try { + try { + wsdlDefinitionHandlerAdapter = (WsdlDefinitionHandlerAdapter) getWebApplicationContext() + .getBean(getWsdlDefinitionHandlerAdapterBeanName(), WsdlDefinitionHandlerAdapter.class); + + } + catch (NoSuchBeanDefinitionException ignored) { + wsdlDefinitionHandlerAdapter = new WsdlDefinitionHandlerAdapter(); + } + wsdlDefinitionHandlerAdapter.setTransformLocations(isTransformWsdlLocations()); + wsdlDefinitionHandlerAdapter.afterPropertiesSet(); + } + catch (Exception ex) { + throw new BeanInitializationException("Could not initialize WsdlDefinitionHandlerAdapter", ex); + } + } + private void initMessageReceiver() { try { messageReceiver = (WebServiceMessageReceiver) getWebApplicationContext() @@ -253,5 +313,13 @@ public class MessageDispatcherServlet extends FrameworkServlet { private void initWsdlDefinitions() { wsdlDefinitions = BeanFactoryUtils .beansOfTypeIncludingAncestors(getWebApplicationContext(), WsdlDefinition.class, true, false); + if (logger.isDebugEnabled()) { + for (Iterator iterator = wsdlDefinitions.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + String beanName = (String) entry.getKey(); + WsdlDefinition definition = (WsdlDefinition) entry.getValue(); + logger.debug("Exposing [" + definition + "] as " + beanName + WSDL_SUFFIX_NAME); + } + } } } diff --git a/core/src/main/java/org/springframework/ws/transport/http/WebServiceMessageReceiverHandlerAdapter.java b/core/src/main/java/org/springframework/ws/transport/http/WebServiceMessageReceiverHandlerAdapter.java index 89e0d996..9c420296 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/WebServiceMessageReceiverHandlerAdapter.java +++ b/core/src/main/java/org/springframework/ws/transport/http/WebServiceMessageReceiverHandlerAdapter.java @@ -55,12 +55,11 @@ public class WebServiceMessageReceiverHandlerAdapter extends WebServiceMessageRe if ("POST".equals(httpServletRequest.getMethod())) { WebServiceConnection connection = new HttpServletConnection(httpServletRequest, httpServletResponse); handleConnection(connection, (WebServiceMessageReceiver) handler); - return null; } else { httpServletResponse.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); - return null; } + return null; } public boolean supports(Object handler) { diff --git a/core/src/main/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapter.java b/core/src/main/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapter.java index 8d74b6f7..48eda361 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapter.java +++ b/core/src/main/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapter.java @@ -19,7 +19,6 @@ package org.springframework.ws.transport.http; import java.util.Iterator; import java.util.List; import java.util.Properties; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.transform.Source; @@ -114,22 +113,24 @@ public class WsdlDefinitionHandlerAdapter extends TransformerObjectSupport imple public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (!"GET".equals(request.getMethod())) { - throw new ServletException("Request method '" + request.getMethod() + "' not supported"); + if ("GET".equals(request.getMethod())) { + response.setContentType(CONTENT_TYPE); + Transformer transformer = createTransformer(); + WsdlDefinition definition = (WsdlDefinition) handler; + Source definitionSource = definition.getSource(); + if (transformLocations) { + DOMResult domResult = new DOMResult(); + transformer.transform(definitionSource, domResult); + Document definitionDocument = (Document) domResult.getNode(); + transformLocations(definitionDocument, request); + definitionSource = new DOMSource(definitionDocument); + } + StreamResult responseResult = new StreamResult(response.getOutputStream()); + transformer.transform(definitionSource, responseResult); } - response.setContentType(CONTENT_TYPE); - Transformer transformer = createTransformer(); - WsdlDefinition definition = (WsdlDefinition) handler; - Source definitionSource = definition.getSource(); - if (transformLocations) { - DOMResult domResult = new DOMResult(); - transformer.transform(definitionSource, domResult); - Document definitionDocument = (Document) domResult.getNode(); - transformLocations(definitionDocument, request); - definitionSource = new DOMSource(definitionDocument); + else { + response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); } - StreamResult responseResult = new StreamResult(response.getOutputStream()); - transformer.transform(definitionSource, responseResult); return null; } diff --git a/core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java b/core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java index 1c20b9a1..0fa65ddc 100644 --- a/core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java +++ b/core/src/test/java/org/springframework/ws/transport/http/WsdlDefinitionHandlerAdapterTest.java @@ -19,7 +19,7 @@ package org.springframework.ws.transport.http; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URI; -import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; import javax.wsdl.Definition; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; @@ -71,14 +71,10 @@ public class WsdlDefinitionHandlerAdapterTest extends XMLTestCase { public void testHandleNonGet() throws Exception { request.setMethod("POST"); definitionControl.replay(); - try { - adapter.handle(request, response, definitionMock); - fail("ServletException expected"); - } - catch (ServletException ex) { - // expected - } + adapter.handle(request, response, definitionMock); definitionControl.verify(); + assertEquals("METHOD_NOT_ALLOWED expected", HttpServletResponse.SC_METHOD_NOT_ALLOWED, response.getStatus()); + } public void testTransformLocations() throws Exception { diff --git a/pom.xml b/pom.xml index 630c59d7..7cd5382e 100644 --- a/pom.xml +++ b/pom.xml @@ -130,7 +130,7 @@ java.net - Java.net Repository for Maven2 + Java.net Repository for Maven http://download.java.net/maven/1/ legacy