Prevent default WebServiceMessageFactory to be created

This commit improves the builder to provide the message factory upfront
rather than setting it after the WebServiceTemplate has been
instantiated.

By providing the factory upfront (if it is set), it prevents the
default strategy to be created first to be then erased by the custom
factory.

Closes gh-48615
This commit is contained in:
Stéphane Nicoll
2025-12-24 14:51:00 +01:00
parent a00f6c0b52
commit 54fc77b51f
2 changed files with 9 additions and 1 deletions
@@ -454,7 +454,8 @@ public class WebServiceTemplateBuilder {
* @see #configure(WebServiceTemplate)
*/
public WebServiceTemplate build() {
return configure(new WebServiceTemplate());
return configure(
(this.messageFactory != null) ? new WebServiceTemplate(this.messageFactory) : new WebServiceTemplate());
}
/**
@@ -38,6 +38,7 @@ import org.springframework.ws.client.core.FaultMessageResolver;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.client.support.destination.DestinationProvider;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.transport.WebServiceMessageSender;
import org.springframework.ws.transport.http.ClientHttpRequestMessageSender;
import org.springframework.ws.transport.http.HttpUrlConnectionMessageSender;
@@ -318,6 +319,12 @@ class WebServiceTemplateBuilderTests {
then(template).should().setTransformerFactoryClass(SAXTransformerFactory.class);
}
@Test
void buildShouldDetectWebServiceMessageFactory() {
WebServiceTemplate webServiceTemplate = this.builder.build();
assertThat(webServiceTemplate.getMessageFactory()).isInstanceOf(SaajSoapMessageFactory.class);
}
@Test
void setWebServiceMessageFactory() {
WebServiceMessageFactory messageFactory = mock(WebServiceMessageFactory.class);