diff --git a/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/config/WebServiceHandlerParser.java b/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/config/WebServiceHandlerParser.java index fa7c43d41a..156e6d1585 100644 --- a/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/config/WebServiceHandlerParser.java +++ b/org.springframework.integration.ws/src/main/java/org/springframework/integration/ws/config/WebServiceHandlerParser.java @@ -18,7 +18,6 @@ package org.springframework.integration.ws.config; import org.w3c.dom.Element; -import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; @@ -26,8 +25,6 @@ import org.springframework.integration.ConfigurationException; import org.springframework.integration.ws.handler.MarshallingWebServiceHandler; import org.springframework.integration.ws.handler.SimpleWebServiceHandler; import org.springframework.util.StringUtils; -import org.springframework.ws.WebServiceMessageFactory; -import org.springframework.ws.client.core.SourceExtractor; /** * Parser for the <ws-handler/> element. @@ -70,8 +67,7 @@ public class WebServiceHandlerParser extends AbstractSingleBeanDefinitionParser else { String sourceExtractorRef = element.getAttribute("source-extractor"); if (StringUtils.hasText(sourceExtractorRef)) { - builder.getBeanDefinition().getConstructorArgumentValues().addGenericArgumentValue( - new RuntimeBeanReference(sourceExtractorRef), SourceExtractor.class.getName()); + builder.addConstructorArgReference(sourceExtractorRef); } else { builder.addConstructorArgValue(null); @@ -79,8 +75,7 @@ public class WebServiceHandlerParser extends AbstractSingleBeanDefinitionParser } String messageFactoryRef = element.getAttribute("message-factory"); if (StringUtils.hasText(messageFactoryRef)) { - builder.getBeanDefinition().getConstructorArgumentValues().addGenericArgumentValue( - new RuntimeBeanReference(messageFactoryRef), WebServiceMessageFactory.class.getName()); + builder.addConstructorArgReference(messageFactoryRef); } String requestCallbackRef = element.getAttribute("request-callback"); if (StringUtils.hasText(requestCallbackRef)) { diff --git a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/WebServiceHandlerParserTests.java b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/WebServiceHandlerParserTests.java index 0cfe337b2d..e44ddee57d 100644 --- a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/WebServiceHandlerParserTests.java +++ b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/WebServiceHandlerParserTests.java @@ -82,6 +82,20 @@ public class WebServiceHandlerParserTests { assertEquals(factory, accessor.getPropertyValue("messageFactory")); } + @Test + public void testSimpleWebServiceHandlerWithCustomSourceExtractorAndMessageFactory() { + ApplicationContext context = new ClassPathXmlApplicationContext( + "simpleWebServiceHandlerParserTests.xml", this.getClass()); + MessageHandler handler = (MessageHandler) context.getBean("handlerWithCustomSourceExtractorAndMessageFactory"); + SourceExtractor sourceExtractor = (SourceExtractor) context.getBean("sourceExtractor"); + assertEquals(SimpleWebServiceHandler.class, handler.getClass()); + DirectFieldAccessor accessor = new DirectFieldAccessor(handler); + assertEquals(sourceExtractor, accessor.getPropertyValue("sourceExtractor")); + accessor = new DirectFieldAccessor(accessor.getPropertyValue("webServiceTemplate")); + WebServiceMessageFactory factory = (WebServiceMessageFactory) context.getBean("messageFactory"); + assertEquals(factory, accessor.getPropertyValue("messageFactory")); + } + @Test public void testSimpleWebServiceHandlerWithCustomFaultMessageResolver() { ApplicationContext context = new ClassPathXmlApplicationContext( @@ -134,4 +148,37 @@ public class WebServiceHandlerParserTests { assertEquals(callback, accessor.getPropertyValue("requestCallback")); } + @Test + public void testWebServiceHandlerWithAllInOneMarshallerAndMessageFactory() { + ApplicationContext context = new ClassPathXmlApplicationContext( + "marshallingWebServiceHandlerParserTests.xml", this.getClass()); + MessageHandler handler = (MessageHandler) context.getBean("handlerWithAllInOneMarshallerAndMessageFactory"); + assertEquals(MarshallingWebServiceHandler.class, handler.getClass()); + DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler); + DirectFieldAccessor templateAccessor = new DirectFieldAccessor( + handlerAccessor.getPropertyValue("webServiceTemplate")); + Marshaller marshaller = (Marshaller) context.getBean("marshallerAndUnmarshaller"); + assertEquals(marshaller, templateAccessor.getPropertyValue("marshaller")); + assertEquals(marshaller, templateAccessor.getPropertyValue("unmarshaller")); + WebServiceMessageFactory messageFactory = (WebServiceMessageFactory) context.getBean("messageFactory"); + assertEquals(messageFactory, templateAccessor.getPropertyValue("messageFactory")); + } + + @Test + public void testWebServiceHandlerWithSeparateMarshallerAndUnmarshallerAndMessageFactory() { + ApplicationContext context = new ClassPathXmlApplicationContext( + "marshallingWebServiceHandlerParserTests.xml", this.getClass()); + MessageHandler handler = (MessageHandler) context.getBean("handlerWithSeparateMarshallerAndUnmarshallerAndMessageFactory"); + assertEquals(MarshallingWebServiceHandler.class, handler.getClass()); + DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(handler); + DirectFieldAccessor templateAccessor = new DirectFieldAccessor( + handlerAccessor.getPropertyValue("webServiceTemplate")); + Marshaller marshaller = (Marshaller) context.getBean("marshaller"); + Unmarshaller unmarshaller = (Unmarshaller) context.getBean("unmarshaller"); + assertEquals(marshaller, templateAccessor.getPropertyValue("marshaller")); + assertEquals(unmarshaller, templateAccessor.getPropertyValue("unmarshaller")); + WebServiceMessageFactory messageFactory = (WebServiceMessageFactory) context.getBean("messageFactory"); + assertEquals(messageFactory, templateAccessor.getPropertyValue("messageFactory")); + } + } diff --git a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/marshallingWebServiceHandlerParserTests.xml b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/marshallingWebServiceHandlerParserTests.xml index 1bac1d75cc..a8ce3ccd13 100644 --- a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/marshallingWebServiceHandlerParserTests.xml +++ b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/marshallingWebServiceHandlerParserTests.xml @@ -21,6 +21,17 @@ marshaller="marshallerAndUnmarshaller" request-callback="requestCallback"/> + + + + @@ -29,4 +40,6 @@ + + diff --git a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/simpleWebServiceHandlerParserTests.xml b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/simpleWebServiceHandlerParserTests.xml index 03afa13389..b499d6829a 100644 --- a/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/simpleWebServiceHandlerParserTests.xml +++ b/org.springframework.integration.ws/src/test/java/org/springframework/integration/ws/config/simpleWebServiceHandlerParserTests.xml @@ -22,6 +22,11 @@ uri="http://example.org" message-factory="messageFactory"/> + +