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"/>
+
+