INT-3309 Pluggable MessageBuilder
This is still a work in process. There are a bunch of TODOs in classes that are not managed by Spring and so need to have the MessageBuilderFactory injected. But I am looking for feedback on the approach. INT-3309 Resolve TODOs Provide access to the MessageBuilderFactory in all classes. INT-3309 Polishing + Tests * Fallback to 'fromMessage()' if mutating and inbound message is not MutableMessage * Add 'alwaysMutate' boolean to MutableMessageBuilderFactory - coerces 'fromMessage' calls to 'mutateMessage' * Add tests INT-3309 Polishing; PR Comments Also add tests to parent/child contexts where the parent has the default message builder and the child has a mutable message builder. INT-3309 More Polish; PR Comments Also fix removeHeader in MMB.
This commit is contained in:
committed by
Artem Bilan
parent
4c775bce9d
commit
ff845b5069
@@ -18,10 +18,10 @@ package org.springframework.integration.ws;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.expression.ExpressionException;
|
||||
import org.springframework.integration.gateway.MessagingGatewaySupport;
|
||||
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessagingException;
|
||||
import org.springframework.integration.gateway.MessagingGatewaySupport;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.ws.WebServiceMessage;
|
||||
@@ -34,18 +34,19 @@ import org.springframework.ws.soap.SoapMessage;
|
||||
* @since 2.1
|
||||
*/
|
||||
abstract public class AbstractWebServiceInboundGateway extends MessagingGatewaySupport implements MessageEndpoint {
|
||||
|
||||
|
||||
protected volatile SoapHeaderMapper headerMapper = new DefaultSoapHeaderMapper();
|
||||
|
||||
|
||||
@Override
|
||||
public String getComponentType() {
|
||||
return "ws:inbound-gateway";
|
||||
}
|
||||
|
||||
|
||||
public void setHeaderMapper(SoapHeaderMapper headerMapper) {
|
||||
Assert.notNull(headerMapper, "headerMapper must not be null");
|
||||
this.headerMapper = headerMapper;
|
||||
}
|
||||
|
||||
|
||||
public void invoke(MessageContext messageContext) throws Exception {
|
||||
Assert.notNull(messageContext,"'messageContext' is required; it must not be null.");
|
||||
|
||||
@@ -60,8 +61,8 @@ abstract public class AbstractWebServiceInboundGateway extends MessagingGatewayS
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
protected void fromSoapHeaders(MessageContext messageContext, MessageBuilder<?> builder){
|
||||
|
||||
protected void fromSoapHeaders(MessageContext messageContext, AbstractIntegrationMessageBuilder<?> builder){
|
||||
WebServiceMessage request = messageContext.getRequest();
|
||||
String[] propertyNames = messageContext.getPropertyNames();
|
||||
if (propertyNames != null) {
|
||||
@@ -77,13 +78,13 @@ abstract public class AbstractWebServiceInboundGateway extends MessagingGatewayS
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected void toSoapHeaders(WebServiceMessage response, Message<?> replyMessage){
|
||||
if (response instanceof SoapMessage) {
|
||||
this.headerMapper.fromHeadersToReply(
|
||||
replyMessage.getHeaders(), (SoapMessage) response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
abstract protected void doInvoke(MessageContext messageContext) throws Exception;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@ import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.spel.support.StandardEvaluationContext;
|
||||
import org.springframework.integration.expression.ExpressionUtils;
|
||||
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.MessageDeliveryException;
|
||||
@@ -231,7 +230,7 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro
|
||||
if (resultObject != null && message instanceof SoapMessage){
|
||||
Map<String, Object> mappedMessageHeaders =
|
||||
AbstractWebServiceOutboundGateway.this.headerMapper.toHeadersFromReply((SoapMessage) message);
|
||||
return MessageBuilder.withPayload(resultObject).copyHeaders(mappedMessageHeaders).build();
|
||||
return AbstractWebServiceOutboundGateway.this.getMessageBuilderFactory().withPayload(resultObject).copyHeaders(mappedMessageHeaders).build();
|
||||
}
|
||||
else {
|
||||
return resultObject;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.integration.ws;
|
||||
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.oxm.Marshaller;
|
||||
import org.springframework.oxm.Unmarshaller;
|
||||
@@ -98,7 +98,7 @@ public class MarshallingWebServiceInboundGateway extends AbstractWebServiceInbou
|
||||
WebServiceMessage request = messageContext.getRequest();
|
||||
Assert.notNull(request, "Invalid message context: request was null.");
|
||||
Object requestObject = MarshallingUtils.unmarshal(unmarshaller, request);
|
||||
MessageBuilder<?> builder = MessageBuilder.withPayload(requestObject);
|
||||
AbstractIntegrationMessageBuilder<?> builder = this.getMessageBuilderFactory().withPayload(requestObject);
|
||||
|
||||
this.fromSoapHeaders(messageContext, builder);
|
||||
|
||||
|
||||
@@ -21,14 +21,15 @@ import javax.xml.transform.Source;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.ws.WebServiceMessage;
|
||||
import org.springframework.ws.context.MessageContext;
|
||||
import org.springframework.xml.transform.StringSource;
|
||||
import org.springframework.xml.transform.TransformerObjectSupport;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
@@ -45,18 +46,19 @@ public class SimpleWebServiceInboundGateway extends AbstractWebServiceInboundGat
|
||||
this.extractPayload = extractPayload;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doInvoke(MessageContext messageContext) throws Exception {
|
||||
|
||||
|
||||
WebServiceMessage request = messageContext.getRequest();
|
||||
Assert.notNull(request, "Invalid message context: request was null.");
|
||||
|
||||
MessageBuilder<?> builder = MessageBuilder.withPayload(
|
||||
|
||||
AbstractIntegrationMessageBuilder<?> builder = this.getMessageBuilderFactory().withPayload(
|
||||
(this.extractPayload) ? request.getPayloadSource() : request);
|
||||
|
||||
|
||||
this.fromSoapHeaders(messageContext, builder);
|
||||
|
||||
Message<?> replyMessage = this.sendAndReceiveMessage(builder.build());
|
||||
|
||||
|
||||
if (replyMessage != null) {
|
||||
Object replyPayload = replyMessage.getPayload();
|
||||
Source responseSource = null;
|
||||
@@ -77,9 +79,9 @@ public class SimpleWebServiceInboundGateway extends AbstractWebServiceInboundGat
|
||||
}
|
||||
WebServiceMessage response = messageContext.getResponse();
|
||||
this.transformerSupportDelegate.transformSourceToResult(responseSource, response.getPayloadResult());
|
||||
|
||||
|
||||
this.toSoapHeaders(response, replyMessage);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user