Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -25,6 +25,8 @@

import javax.xml.transform.TransformerException;

import org.jspecify.annotations.Nullable;

import org.springframework.expression.Expression;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.integration.expression.ExpressionEvalMap;
Expand Down Expand Up @@ -59,6 +61,7 @@
* @author Artem Bilan
* @author Christian Tzolov
* @author Ngoc Nhan
* @author Jooyoung Pyoung
*/
public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyProducingMessageHandler {

Expand All @@ -68,13 +71,14 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro

private final String uri;

private final DestinationProvider destinationProvider;
private final @Nullable DestinationProvider destinationProvider;

private final Map<String, Expression> uriVariableExpressions = new HashMap<>();

@SuppressWarnings("NullAway.Init")
private StandardEvaluationContext evaluationContext;

private WebServiceMessageCallback requestCallback;
private @Nullable WebServiceMessageCallback requestCallback;

private WebServiceTemplate webServiceTemplate;

Expand All @@ -84,13 +88,46 @@ public abstract class AbstractWebServiceOutboundGateway extends AbstractReplyPro

private boolean webServiceTemplateExplicitlySet;

public AbstractWebServiceOutboundGateway(final String uri) {
Assert.hasText(uri, "URI must not be empty");
this.webServiceTemplate = new WebServiceTemplate();
this.destinationProvider = null;
this.uri = uri;
}

public AbstractWebServiceOutboundGateway(final String uri, WebServiceMessageFactory messageFactory) {
Assert.hasText(uri, "URI must not be empty");
this.webServiceTemplate = new WebServiceTemplate(messageFactory);
this.destinationProvider = null;
this.uri = uri;
}

public AbstractWebServiceOutboundGateway(final String uri, WebServiceTemplate webServiceTemplate) {
Assert.hasText(uri, "URI must not be empty");
doSetWebServiceTemplate(webServiceTemplate);
this.destinationProvider = null;
this.uri = uri;
}

protected AbstractWebServiceOutboundGateway(DestinationProvider destinationProvider,
WebServiceTemplate webServiceTemplate) {

Assert.notNull(destinationProvider, "DestinationProvider must not be null");
doSetWebServiceTemplate(webServiceTemplate);
this.destinationProvider = destinationProvider;
this.uri = "";
}

public AbstractWebServiceOutboundGateway(DestinationProvider destinationProvider) {
Assert.notNull(destinationProvider, "DestinationProvider must not be null");
this.webServiceTemplate = new WebServiceTemplate();
this.destinationProvider = destinationProvider;
// we always call WebServiceTemplate methods with an explicit URI argument,
// but in case the WebServiceTemplate is accessed directly we'll set this:
this.webServiceTemplate.setDestinationProvider(destinationProvider);
this.uri = "";
}

public AbstractWebServiceOutboundGateway(DestinationProvider destinationProvider,
WebServiceMessageFactory messageFactory) {

Expand All @@ -100,7 +137,7 @@ public AbstractWebServiceOutboundGateway(DestinationProvider destinationProvider
// we always call WebServiceTemplate methods with an explicit URI argument,
// but in case the WebServiceTemplate is accessed directly we'll set this:
this.webServiceTemplate.setDestinationProvider(destinationProvider);
this.uri = null;
this.uri = "";
}

public void setHeaderMapper(SoapHeaderMapper headerMapper) {
Expand Down Expand Up @@ -165,7 +202,7 @@ public void setMessageFactory(WebServiceMessageFactory messageFactory) {
this.webServiceTemplate.setMessageFactory(messageFactory);
}

public void setRequestCallback(WebServiceMessageCallback requestCallback) {
public void setRequestCallback(@Nullable WebServiceMessageCallback requestCallback) {
this.requestCallback = requestCallback;
}

Expand Down Expand Up @@ -199,7 +236,7 @@ protected WebServiceTemplate getWebServiceTemplate() {
}

@Override
public final Object handleRequestMessage(Message<?> requestMessage) {
public final @Nullable Object handleRequestMessage(Message<?> requestMessage) {
URI uriWithVariables = prepareUri(requestMessage);
if (uriWithVariables == null) {
throw new MessageDeliveryException(requestMessage, "Failed to determine URI for " +
Expand All @@ -215,7 +252,7 @@ public final Object handleRequestMessage(Message<?> requestMessage) {
return null;
}

private URI prepareUri(Message<?> requestMessage) {
private @Nullable URI prepareUri(Message<?> requestMessage) {
if (this.destinationProvider != null) {
return this.destinationProvider.getDestination();
}
Expand All @@ -229,17 +266,17 @@ private URI prepareUri(Message<?> requestMessage) {
return this.uriFactory.expand(this.uri, uriVariables);
}

protected abstract Object doHandle(String theUri, Message<?> requestMessage,
WebServiceMessageCallback reqCallback);
protected abstract @Nullable Object doHandle(String theUri, Message<?> requestMessage,
@Nullable WebServiceMessageCallback reqCallback);

protected abstract class RequestMessageCallback extends TransformerObjectSupport
implements WebServiceMessageCallback {

private final WebServiceMessageCallback reqCallback;
private final @Nullable WebServiceMessageCallback reqCallback;

private final Message<?> requestMessage;

public RequestMessageCallback(WebServiceMessageCallback requestCallback, Message<?> requestMessage) {
public RequestMessageCallback(@Nullable WebServiceMessageCallback requestCallback, Message<?> requestMessage) {
this.reqCallback = requestCallback;
this.requestMessage = requestMessage;
}
Expand All @@ -266,7 +303,7 @@ protected abstract class ResponseMessageExtractor extends TransformerObjectSuppo
implements WebServiceMessageExtractor<Object> {

@Override
public Object extractData(WebServiceMessage message)
public @Nullable Object extractData(WebServiceMessage message)
throws IOException, TransformerException {

Object resultObject = this.doExtractData(message);
Expand All @@ -284,7 +321,7 @@ public Object extractData(WebServiceMessage message)
}
}

public abstract Object doExtractData(WebServiceMessage message) throws IOException, TransformerException;
public abstract @Nullable Object doExtractData(WebServiceMessage message) throws IOException, TransformerException;

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2019 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -53,6 +53,7 @@
* @author Mauro Molinari
* @author Artem Bilan
* @author Gary Russell
* @author Jooyoung Pyoung
*
* @since 2.0
*/
Expand Down Expand Up @@ -126,6 +127,10 @@ else if (!StringUtils.hasText(target.getSoapAction())) {
@Override
protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage target) {
SoapHeader soapHeader = target.getSoapHeader();
if (soapHeader == null) {
return;
}

if (headerValue instanceof String) {
QName qname = QNameUtils.parseQNameString(headerName);
soapHeader.addAttribute(qname, (String) headerValue);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -35,8 +35,10 @@
*/
public class MarshallingWebServiceInboundGateway extends AbstractWebServiceInboundGateway {

@SuppressWarnings("NullAway.Init")
private Marshaller marshaller;

@SuppressWarnings("NullAway.Init")
private Unmarshaller unmarshaller;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@

import java.io.IOException;

import org.springframework.lang.Nullable;
import org.jspecify.annotations.Nullable;

import org.springframework.messaging.Message;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
Expand All @@ -45,11 +46,12 @@ public class MarshallingWebServiceOutboundGateway extends AbstractWebServiceOutb

@SuppressWarnings("this-escape")
public MarshallingWebServiceOutboundGateway(DestinationProvider destinationProvider, Marshaller marshaller,
Unmarshaller unmarshaller, WebServiceMessageFactory messageFactory) {
@Nullable Unmarshaller unmarshaller, WebServiceMessageFactory messageFactory) {
super(destinationProvider, messageFactory);
configureMarshallers(marshaller, unmarshaller);
}

@SuppressWarnings("NullAway")
public MarshallingWebServiceOutboundGateway(DestinationProvider destinationProvider, Marshaller marshaller,
Unmarshaller unmarshaller) {
this(destinationProvider, marshaller, unmarshaller, null);
Expand All @@ -60,17 +62,19 @@ public MarshallingWebServiceOutboundGateway(DestinationProvider destinationProvi
this(destinationProvider, marshaller, null, messageFactory);
}

@SuppressWarnings("NullAway")
public MarshallingWebServiceOutboundGateway(DestinationProvider destinationProvider, Marshaller marshaller) {
this(destinationProvider, marshaller, (WebServiceMessageFactory) null);
}

@SuppressWarnings("this-escape")
public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller, Unmarshaller unmarshaller,
public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller, @Nullable Unmarshaller unmarshaller,
WebServiceMessageFactory messageFactory) {
super(uri, messageFactory);
configureMarshallers(marshaller, unmarshaller);
}

@SuppressWarnings("NullAway")
public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller, Unmarshaller unmarshaller) {
this(uri, marshaller, unmarshaller, null);
}
Expand All @@ -80,6 +84,7 @@ public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller,
this(uri, marshaller, null, messageFactory);
}

@SuppressWarnings("NullAway")
public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller) {
this(uri, marshaller, (WebServiceMessageFactory) null);
}
Expand All @@ -92,8 +97,7 @@ public MarshallingWebServiceOutboundGateway(String uri, Marshaller marshaller) {
*/
@SuppressWarnings("this-escape")
public MarshallingWebServiceOutboundGateway(String uri, WebServiceTemplate webServiceTemplate) {
super(uri, null);
doSetWebServiceTemplate(webServiceTemplate);
super(uri, webServiceTemplate);
}

/**
Expand All @@ -105,8 +109,7 @@ public MarshallingWebServiceOutboundGateway(String uri, WebServiceTemplate webSe
@SuppressWarnings("this-escape")
public MarshallingWebServiceOutboundGateway(DestinationProvider destinationProvider,
WebServiceTemplate webServiceTemplate) {
super(destinationProvider, null);
doSetWebServiceTemplate(webServiceTemplate);
super(destinationProvider, webServiceTemplate);
}

/**
Expand Down Expand Up @@ -139,15 +142,15 @@ public String getComponentType() {
}

@Override
protected Object doHandle(String uri, Message<?> requestMessage, WebServiceMessageCallback requestCallback) {
protected @Nullable Object doHandle(String uri, Message<?> requestMessage, @Nullable WebServiceMessageCallback requestCallback) {
return getWebServiceTemplate()
.marshalSendAndReceive(uri, requestMessage.getPayload(),
new PassThroughRequestMessageCallback(requestCallback, requestMessage));
}

private final class PassThroughRequestMessageCallback extends RequestMessageCallback {

PassThroughRequestMessageCallback(WebServiceMessageCallback requestCallback, Message<?> requestMessage) {
PassThroughRequestMessageCallback(@Nullable WebServiceMessageCallback requestCallback, Message<?> requestMessage) {
super(requestCallback, requestMessage);
}

Expand Down
Loading