/*
 * Copyright 2012-2020 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.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.webservices.client;

import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.xml.transform.TransformerFactory;

import org.springframework.beans.BeanUtils;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.ws.WebServiceMessageFactory;
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.transport.WebServiceMessageSender;

Builder that can be used to configure and create a WebServiceTemplate. Provides convenience methods to register message senders, client interceptors and customizers.

By default the built WebServiceTemplate uses the most suitable HTTP-based WebServiceMessageSender, call detectHttpMessageSender(false) if you prefer to keep the default. In a typical auto-configured Spring Boot application this builder is available as a bean and can be injected whenever a WebServiceTemplate is needed.

Author:Dmytro Nosan, Stephane Nicoll
Since:2.1.0
/** * Builder that can be used to configure and create a {@link WebServiceTemplate}. Provides * convenience methods to register {@link #messageSenders(WebServiceMessageSender...) * message senders}, {@link #interceptors(ClientInterceptor...) client interceptors} and * {@link #customizers(WebServiceTemplateCustomizer...) customizers}. * <p> * By default the built {@link WebServiceTemplate} uses the most suitable HTTP-based * {@link WebServiceMessageSender}, call {@link #detectHttpMessageSender(boolean) * detectHttpMessageSender(false)} if you prefer to keep the default. In a typical * auto-configured Spring Boot application this builder is available as a bean and can be * injected whenever a {@link WebServiceTemplate} is needed. * * @author Dmytro Nosan * @author Stephane Nicoll * @since 2.1.0 */
public class WebServiceTemplateBuilder { private final boolean detectHttpMessageSender; private final Set<ClientInterceptor> interceptors; private final Set<WebServiceTemplateCustomizer> internalCustomizers; private final Set<WebServiceTemplateCustomizer> customizers; private final WebServiceMessageSenders messageSenders; private final Marshaller marshaller; private final Unmarshaller unmarshaller; private final DestinationProvider destinationProvider; private final Class<? extends TransformerFactory> transformerFactoryClass; private final WebServiceMessageFactory messageFactory; public WebServiceTemplateBuilder(WebServiceTemplateCustomizer... customizers) { this.detectHttpMessageSender = true; this.interceptors = null; this.internalCustomizers = null; this.customizers = Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList(customizers))); this.messageSenders = new WebServiceMessageSenders(); this.marshaller = null; this.unmarshaller = null; this.destinationProvider = null; this.transformerFactoryClass = null; this.messageFactory = null; } private WebServiceTemplateBuilder(boolean detectHttpMessageSender, Set<ClientInterceptor> interceptors, Set<WebServiceTemplateCustomizer> internalCustomizers, Set<WebServiceTemplateCustomizer> customizers, WebServiceMessageSenders messageSenders, Marshaller marshaller, Unmarshaller unmarshaller, DestinationProvider destinationProvider, Class<? extends TransformerFactory> transformerFactoryClass, WebServiceMessageFactory messageFactory) { this.detectHttpMessageSender = detectHttpMessageSender; this.interceptors = interceptors; this.internalCustomizers = internalCustomizers; this.customizers = customizers; this.messageSenders = messageSenders; this.marshaller = marshaller; this.unmarshaller = unmarshaller; this.destinationProvider = destinationProvider; this.transformerFactoryClass = transformerFactoryClass; this.messageFactory = messageFactory; }
Set if a suitable HTTP-based WebServiceMessageSender should be detected based on the classpath. Default is true.
Params:
  • detectHttpMessageSender – if a HTTP-based WebServiceMessageSender should be detected
See Also:
Returns:a new builder instance
/** * Set if a suitable HTTP-based {@link WebServiceMessageSender} should be detected * based on the classpath. Default is {@code true}. * @param detectHttpMessageSender if a HTTP-based {@link WebServiceMessageSender} * should be detected * @return a new builder instance * @see HttpWebServiceMessageSenderBuilder */
public WebServiceTemplateBuilder detectHttpMessageSender(boolean detectHttpMessageSender) { return new WebServiceTemplateBuilder(detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Sets the WebServiceMessageSenders that should be used with the WebServiceTemplate. Setting this value will replace any previously defined message senders, including the HTTP-based message sender, if any. Consider using additionalMessageSenders(WebServiceMessageSender...) to keep it with user-defined message senders.
Params:
  • messageSenders – the message senders to set
See Also:
Returns:a new builder instance.
/** * Sets the {@link WebServiceMessageSender WebServiceMessageSenders} that should be * used with the {@link WebServiceTemplate}. Setting this value will replace any * previously defined message senders, including the HTTP-based message sender, if * any. Consider using {@link #additionalMessageSenders(WebServiceMessageSender...)} * to keep it with user-defined message senders. * @param messageSenders the message senders to set * @return a new builder instance. * @see #additionalMessageSenders(WebServiceMessageSender...) * @see #detectHttpMessageSender(boolean) */
public WebServiceTemplateBuilder messageSenders(WebServiceMessageSender... messageSenders) { Assert.notNull(messageSenders, "MessageSenders must not be null"); return messageSenders(Arrays.asList(messageSenders)); }
Sets the WebServiceMessageSenders that should be used with the WebServiceTemplate. Setting this value will replace any previously defined message senders, including the HTTP-based message sender, if any. Consider using additionalMessageSenders(Collection) to keep it with user-defined message senders.
Params:
  • messageSenders – the message senders to set
See Also:
Returns:a new builder instance.
/** * Sets the {@link WebServiceMessageSender WebServiceMessageSenders} that should be * used with the {@link WebServiceTemplate}. Setting this value will replace any * previously defined message senders, including the HTTP-based message sender, if * any. Consider using {@link #additionalMessageSenders(Collection)} to keep it with * user-defined message senders. * @param messageSenders the message senders to set * @return a new builder instance. * @see #additionalMessageSenders(Collection) * @see #detectHttpMessageSender(boolean) */
public WebServiceTemplateBuilder messageSenders(Collection<? extends WebServiceMessageSender> messageSenders) { Assert.notNull(messageSenders, "MessageSenders must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders.set(messageSenders), this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Add additional WebServiceMessageSenders that should be used with the WebServiceTemplate.
Params:
  • messageSenders – the message senders to add
See Also:
  • messageSenders(WebServiceMessageSender...)
Returns:a new builder instance.
/** * Add additional {@link WebServiceMessageSender WebServiceMessageSenders} that should * be used with the {@link WebServiceTemplate}. * @param messageSenders the message senders to add * @return a new builder instance. * @see #messageSenders(WebServiceMessageSender...) */
public WebServiceTemplateBuilder additionalMessageSenders(WebServiceMessageSender... messageSenders) { Assert.notNull(messageSenders, "MessageSenders must not be null"); return additionalMessageSenders(Arrays.asList(messageSenders)); }
Add additional WebServiceMessageSenders that should be used with the WebServiceTemplate.
Params:
  • messageSenders – the message senders to add
See Also:
  • messageSenders(Collection)
Returns:a new builder instance.
/** * Add additional {@link WebServiceMessageSender WebServiceMessageSenders} that should * be used with the {@link WebServiceTemplate}. * @param messageSenders the message senders to add * @return a new builder instance. * @see #messageSenders(Collection) */
public WebServiceTemplateBuilder additionalMessageSenders( Collection<? extends WebServiceMessageSender> messageSenders) { Assert.notNull(messageSenders, "MessageSenders must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders.add(messageSenders), this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Set the ClientInterceptors that should be used with the WebServiceTemplate. Setting this value will replace any previously defined interceptors.
Params:
  • interceptors – the interceptors to set
See Also:
  • additionalInterceptors(ClientInterceptor...)
Returns:a new builder instance
/** * Set the {@link ClientInterceptor ClientInterceptors} that should be used with the * {@link WebServiceTemplate}. Setting this value will replace any previously defined * interceptors. * @param interceptors the interceptors to set * @return a new builder instance * @see #additionalInterceptors(ClientInterceptor...) */
public WebServiceTemplateBuilder interceptors(ClientInterceptor... interceptors) { Assert.notNull(interceptors, "Interceptors must not be null"); return interceptors(Arrays.asList(interceptors)); }
Set the ClientInterceptors that should be used with the WebServiceTemplate. Setting this value will replace any previously defined interceptors.
Params:
  • interceptors – the interceptors to set
See Also:
  • additionalInterceptors(Collection)
Returns:a new builder instance
/** * Set the {@link ClientInterceptor ClientInterceptors} that should be used with the * {@link WebServiceTemplate}. Setting this value will replace any previously defined * interceptors. * @param interceptors the interceptors to set * @return a new builder instance * @see #additionalInterceptors(Collection) */
public WebServiceTemplateBuilder interceptors(Collection<? extends ClientInterceptor> interceptors) { Assert.notNull(interceptors, "Interceptors must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, append(Collections.<ClientInterceptor>emptySet(), interceptors), this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Add additional ClientInterceptors that should be used with the WebServiceTemplate.
Params:
  • interceptors – the interceptors to add
See Also:
  • interceptors(ClientInterceptor...)
Returns:a new builder instance
/** * Add additional {@link ClientInterceptor ClientInterceptors} that should be used * with the {@link WebServiceTemplate}. * @param interceptors the interceptors to add * @return a new builder instance * @see #interceptors(ClientInterceptor...) */
public WebServiceTemplateBuilder additionalInterceptors(ClientInterceptor... interceptors) { Assert.notNull(interceptors, "Interceptors must not be null"); return additionalInterceptors(Arrays.asList(interceptors)); }
Add additional ClientInterceptors that should be used with the WebServiceTemplate.
Params:
  • interceptors – the interceptors to add
See Also:
  • interceptors(Collection)
Returns:a new builder instance
/** * Add additional {@link ClientInterceptor ClientInterceptors} that should be used * with the {@link WebServiceTemplate}. * @param interceptors the interceptors to add * @return a new builder instance * @see #interceptors(Collection) */
public WebServiceTemplateBuilder additionalInterceptors(Collection<? extends ClientInterceptor> interceptors) { Assert.notNull(interceptors, "Interceptors must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, append(this.interceptors, interceptors), this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Set WebServiceTemplateCustomizers that should be applied to the WebServiceTemplate. Customizers are applied in the order that they were added after builder configuration has been applied. Setting this value will replace any previously configured customizers.
Params:
  • customizers – the customizers to set
See Also:
Returns:a new builder instance
/** * Set {@link WebServiceTemplateCustomizer WebServiceTemplateCustomizers} that should * be applied to the {@link WebServiceTemplate}. Customizers are applied in the order * that they were added after builder configuration has been applied. Setting this * value will replace any previously configured customizers. * @param customizers the customizers to set * @return a new builder instance * @see #additionalCustomizers(WebServiceTemplateCustomizer...) */
public WebServiceTemplateBuilder customizers(WebServiceTemplateCustomizer... customizers) { Assert.notNull(customizers, "Customizers must not be null"); return customizers(Arrays.asList(customizers)); }
Set WebServiceTemplateCustomizers that should be applied to the WebServiceTemplate. Customizers are applied in the order that they were added after builder configuration has been applied. Setting this value will replace any previously configured customizers.
Params:
  • customizers – the customizers to set
See Also:
Returns:a new builder instance
/** * Set {@link WebServiceTemplateCustomizer WebServiceTemplateCustomizers} that should * be applied to the {@link WebServiceTemplate}. Customizers are applied in the order * that they were added after builder configuration has been applied. Setting this * value will replace any previously configured customizers. * @param customizers the customizers to set * @return a new builder instance * @see #additionalCustomizers(Collection) */
public WebServiceTemplateBuilder customizers(Collection<? extends WebServiceTemplateCustomizer> customizers) { Assert.notNull(customizers, "Customizers must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, append(Collections.<WebServiceTemplateCustomizer>emptySet(), customizers), this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Add additional WebServiceTemplateCustomizers that should be applied to the WebServiceTemplate. Customizers are applied in the order that they were added after builder configuration has been applied.
Params:
  • customizers – the customizers to add
See Also:
Returns:a new builder instance
/** * Add additional {@link WebServiceTemplateCustomizer WebServiceTemplateCustomizers} * that should be applied to the {@link WebServiceTemplate}. Customizers are applied * in the order that they were added after builder configuration has been applied. * @param customizers the customizers to add * @return a new builder instance * @see #customizers(WebServiceTemplateCustomizer...) */
public WebServiceTemplateBuilder additionalCustomizers(WebServiceTemplateCustomizer... customizers) { Assert.notNull(customizers, "Customizers must not be null"); return additionalCustomizers(Arrays.asList(customizers)); }
Add additional WebServiceTemplateCustomizers that should be applied to the WebServiceTemplate. Customizers are applied in the order that they were added after builder configuration has been applied.
Params:
  • customizers – the customizers to add
See Also:
Returns:a new builder instance
/** * Add additional {@link WebServiceTemplateCustomizer WebServiceTemplateCustomizers} * that should be applied to the {@link WebServiceTemplate}. Customizers are applied * in the order that they were added after builder configuration has been applied. * @param customizers the customizers to add * @return a new builder instance * @see #customizers(Collection) */
public WebServiceTemplateBuilder additionalCustomizers( Collection<? extends WebServiceTemplateCustomizer> customizers) { Assert.notNull(customizers, "Customizers must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, append(this.customizers, customizers), this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Indicates whether the connection should be checked for fault indicators (true), or whether we should rely on the message only (false).
Params:
  • checkConnectionForFault – whether to check for fault indicators
See Also:
  • setCheckConnectionForFault.setCheckConnectionForFault(boolean)
Returns:a new builder instance.
/** * Indicates whether the connection should be checked for fault indicators * ({@code true}), or whether we should rely on the message only ({@code false}). * @param checkConnectionForFault whether to check for fault indicators * @return a new builder instance. * @see WebServiceTemplate#setCheckConnectionForFault(boolean) */
public WebServiceTemplateBuilder setCheckConnectionForFault(boolean checkConnectionForFault) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, append(this.internalCustomizers, new CheckConnectionFaultCustomizer(checkConnectionForFault)), this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Indicates whether the connection should be checked for error indicators (true), or whether these should be ignored (false).
Params:
  • checkConnectionForError – whether to check for error indicators
See Also:
  • setCheckConnectionForError.setCheckConnectionForError(boolean)
Returns:a new builder instance.
/** * Indicates whether the connection should be checked for error indicators * ({@code true}), or whether these should be ignored ({@code false}). * @param checkConnectionForError whether to check for error indicators * @return a new builder instance. * @see WebServiceTemplate#setCheckConnectionForError(boolean) */
public WebServiceTemplateBuilder setCheckConnectionForError(boolean checkConnectionForError) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, append(this.internalCustomizers, new CheckConnectionForErrorCustomizer(checkConnectionForError)), this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Sets the WebServiceMessageFactory to use for creating messages.
Params:
  • messageFactory – the message factory to use for creating messages
See Also:
  • setMessageFactory.setMessageFactory(WebServiceMessageFactory)
Returns:a new builder instance.
/** * Sets the {@link WebServiceMessageFactory} to use for creating messages. * @param messageFactory the message factory to use for creating messages * @return a new builder instance. * @see WebServiceTemplate#setMessageFactory(WebServiceMessageFactory) */
public WebServiceTemplateBuilder setWebServiceMessageFactory(WebServiceMessageFactory messageFactory) { Assert.notNull(messageFactory, "MessageFactory must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, messageFactory); }
Set the Unmarshaller to use to deserialize messages.
Params:
  • unmarshaller – the message unmarshaller
See Also:
  • setUnmarshaller.setUnmarshaller(Unmarshaller)
Returns:a new builder instance.
/** * Set the {@link Unmarshaller} to use to deserialize messages. * @param unmarshaller the message unmarshaller * @return a new builder instance. * @see WebServiceTemplate#setUnmarshaller(Unmarshaller) */
public WebServiceTemplateBuilder setUnmarshaller(Unmarshaller unmarshaller) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Set the Marshaller to use to serialize messages.
Params:
  • marshaller – the message marshaller
See Also:
  • setMarshaller.setMarshaller(Marshaller)
Returns:a new builder instance.
/** * Set the {@link Marshaller} to use to serialize messages. * @param marshaller the message marshaller * @return a new builder instance. * @see WebServiceTemplate#setMarshaller(Marshaller) */
public WebServiceTemplateBuilder setMarshaller(Marshaller marshaller) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Set the FaultMessageResolver to use.
Params:
  • faultMessageResolver – the fault message resolver to use
See Also:
  • setFaultMessageResolver.setFaultMessageResolver(FaultMessageResolver)
Returns:a new builder instance.
/** * Set the {@link FaultMessageResolver} to use. * @param faultMessageResolver the fault message resolver to use * @return a new builder instance. * @see WebServiceTemplate#setFaultMessageResolver(FaultMessageResolver) */
public WebServiceTemplateBuilder setFaultMessageResolver(FaultMessageResolver faultMessageResolver) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, append(this.internalCustomizers, new FaultMessageResolverCustomizer(faultMessageResolver)), this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Set the TransformerFactory implementation to use.
Params:
  • transformerFactoryClass – the transformer factory implementation to use
See Also:
  • setTransformerFactoryClass.setTransformerFactoryClass(Class)
Returns:a new builder instance.
/** * Set the {@link TransformerFactory} implementation to use. * @param transformerFactoryClass the transformer factory implementation to use * @return a new builder instance. * @see WebServiceTemplate#setTransformerFactoryClass(Class) */
public WebServiceTemplateBuilder setTransformerFactoryClass( Class<? extends TransformerFactory> transformerFactoryClass) { return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, this.destinationProvider, transformerFactoryClass, this.messageFactory); }
Set the default URI to be used on operations that do not have a URI parameter. Typically, either this property is set, or setDestinationProvider(DestinationProvider), but not both.
Params:
  • defaultUri – the destination provider URI to be used on operations that do not have a URI parameter.
See Also:
  • setDestinationProvider(DestinationProvider)
Returns:a new builder instance.
/** * Set the default URI to be used on operations that do not have a URI parameter. * Typically, either this property is set, or * {@link #setDestinationProvider(DestinationProvider)}, but not both. * @param defaultUri the destination provider URI to be used on operations that do not * have a URI parameter. * @return a new builder instance. * @see #setDestinationProvider(DestinationProvider) */
public WebServiceTemplateBuilder setDefaultUri(String defaultUri) { Assert.hasText(defaultUri, "DefaultUri must not be empty"); return setDestinationProvider(() -> URI.create(defaultUri)); }
Set the DestinationProvider to use. Typically, either this property is set, or setDefaultUri(String), but not both.
Params:
  • destinationProvider – the destination provider to be used on operations that do not have a URI parameter.
See Also:
  • setDestinationProvider.setDestinationProvider(DestinationProvider)
Returns:a new builder instance.
/** * Set the {@link DestinationProvider} to use. Typically, either this property is set, * or {@link #setDefaultUri(String)}, but not both. * @param destinationProvider the destination provider to be used on operations that * do not have a URI parameter. * @return a new builder instance. * @see WebServiceTemplate#setDestinationProvider(DestinationProvider) */
public WebServiceTemplateBuilder setDestinationProvider(DestinationProvider destinationProvider) { Assert.notNull(destinationProvider, "DestinationProvider must not be null"); return new WebServiceTemplateBuilder(this.detectHttpMessageSender, this.interceptors, this.internalCustomizers, this.customizers, this.messageSenders, this.marshaller, this.unmarshaller, destinationProvider, this.transformerFactoryClass, this.messageFactory); }
Build a new WebServiceTemplate instance and configure it using this builder.
See Also:
  • build(Class)
  • configure(WebServiceTemplate)
Returns:a configured WebServiceTemplate instance.
/** * Build a new {@link WebServiceTemplate} instance and configure it using this * builder. * @return a configured {@link WebServiceTemplate} instance. * @see #build(Class) * @see #configure(WebServiceTemplate) */
public WebServiceTemplate build() { return configure(new WebServiceTemplate()); }
Build a new WebServiceTemplate instance of the specified type and configure it using this builder.
Params:
  • webServiceTemplateClass – the template type to create
Type parameters:
  • <T> – the type of web service template
See Also:
  • build()
  • configure(WebServiceTemplate)
Returns:a configured WebServiceTemplate instance.
/** * Build a new {@link WebServiceTemplate} instance of the specified type and configure * it using this builder. * @param <T> the type of web service template * @param webServiceTemplateClass the template type to create * @return a configured {@link WebServiceTemplate} instance. * @see WebServiceTemplateBuilder#build() * @see #configure(WebServiceTemplate) */
public <T extends WebServiceTemplate> T build(Class<T> webServiceTemplateClass) { Assert.notNull(webServiceTemplateClass, "WebServiceTemplateClass must not be null"); return configure(BeanUtils.instantiateClass(webServiceTemplateClass)); }
Configure the provided WebServiceTemplate instance using this builder.
Params:
  • webServiceTemplate – the WebServiceTemplate to configure
Type parameters:
  • <T> – the type of web service template
See Also:
  • build()
  • build(Class)
Returns:the web service template instance
/** * Configure the provided {@link WebServiceTemplate} instance using this builder. * @param <T> the type of web service template * @param webServiceTemplate the {@link WebServiceTemplate} to configure * @return the web service template instance * @see #build() * @see #build(Class) */
public <T extends WebServiceTemplate> T configure(T webServiceTemplate) { Assert.notNull(webServiceTemplate, "WebServiceTemplate must not be null"); configureMessageSenders(webServiceTemplate); PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); applyCustomizers(webServiceTemplate, this.internalCustomizers); map.from(this.marshaller).to(webServiceTemplate::setMarshaller); map.from(this.unmarshaller).to(webServiceTemplate::setUnmarshaller); map.from(this.destinationProvider).to(webServiceTemplate::setDestinationProvider); map.from(this.transformerFactoryClass).to(webServiceTemplate::setTransformerFactoryClass); map.from(this.messageFactory).to(webServiceTemplate::setMessageFactory); if (!CollectionUtils.isEmpty(this.interceptors)) { Set<ClientInterceptor> merged = new LinkedHashSet<>(this.interceptors); if (webServiceTemplate.getInterceptors() != null) { merged.addAll(Arrays.asList(webServiceTemplate.getInterceptors())); } webServiceTemplate.setInterceptors(merged.toArray(new ClientInterceptor[0])); } applyCustomizers(webServiceTemplate, this.customizers); return webServiceTemplate; } private void applyCustomizers(WebServiceTemplate webServiceTemplate, Set<WebServiceTemplateCustomizer> customizers) { if (!CollectionUtils.isEmpty(customizers)) { for (WebServiceTemplateCustomizer customizer : customizers) { customizer.customize(webServiceTemplate); } } } private <T extends WebServiceTemplate> void configureMessageSenders(T webServiceTemplate) { if (this.messageSenders.isOnlyAdditional() && this.detectHttpMessageSender) { Set<WebServiceMessageSender> merged = append(this.messageSenders.getMessageSenders(), new HttpWebServiceMessageSenderBuilder().build()); webServiceTemplate.setMessageSenders(merged.toArray(new WebServiceMessageSender[0])); } else if (!CollectionUtils.isEmpty(this.messageSenders.getMessageSenders())) { webServiceTemplate .setMessageSenders(this.messageSenders.getMessageSenders().toArray(new WebServiceMessageSender[0])); } } private <T> Set<T> append(Set<T> set, T addition) { return append(set, Collections.singleton(addition)); } private static <T> Set<T> append(Set<T> set, Collection<? extends T> additions) { Set<T> result = new LinkedHashSet<>((set != null) ? set : Collections.emptySet()); result.addAll((additions != null) ? additions : Collections.emptyList()); return Collections.unmodifiableSet(result); }
Collect user-defined WebServiceMessageSender and whether only additional message senders were added or not.
/** * Collect user-defined {@link WebServiceMessageSender} and whether only additional * message senders were added or not. */
private static final class WebServiceMessageSenders { private final boolean onlyAdditional; private Set<WebServiceMessageSender> messageSenders; private WebServiceMessageSenders() { this(true, Collections.emptySet()); } private WebServiceMessageSenders(boolean onlyAdditional, Set<WebServiceMessageSender> messageSenders) { this.onlyAdditional = onlyAdditional; this.messageSenders = messageSenders; } boolean isOnlyAdditional() { return this.onlyAdditional; } Set<WebServiceMessageSender> getMessageSenders() { return this.messageSenders; } WebServiceMessageSenders set(Collection<? extends WebServiceMessageSender> messageSenders) { return new WebServiceMessageSenders(false, new LinkedHashSet<>(messageSenders)); } WebServiceMessageSenders add(Collection<? extends WebServiceMessageSender> messageSenders) { return new WebServiceMessageSenders(this.onlyAdditional, append(this.messageSenders, messageSenders)); } }
WebServiceTemplateCustomizer to set checkConnectionForFault.
/** * {@link WebServiceTemplateCustomizer} to set * {@link WebServiceTemplate#setCheckConnectionForFault(boolean) * checkConnectionForFault}. */
private static final class CheckConnectionFaultCustomizer implements WebServiceTemplateCustomizer { private final boolean checkConnectionFault; private CheckConnectionFaultCustomizer(boolean checkConnectionFault) { this.checkConnectionFault = checkConnectionFault; } @Override public void customize(WebServiceTemplate webServiceTemplate) { webServiceTemplate.setCheckConnectionForFault(this.checkConnectionFault); } }
WebServiceTemplateCustomizer to set checkConnectionForError.
/** * {@link WebServiceTemplateCustomizer} to set * {@link WebServiceTemplate#setCheckConnectionForError(boolean) * checkConnectionForError}. */
private static final class CheckConnectionForErrorCustomizer implements WebServiceTemplateCustomizer { private final boolean checkConnectionForError; private CheckConnectionForErrorCustomizer(boolean checkConnectionForError) { this.checkConnectionForError = checkConnectionForError; } @Override public void customize(WebServiceTemplate webServiceTemplate) { webServiceTemplate.setCheckConnectionForError(this.checkConnectionForError); } }
WebServiceTemplateCustomizer to set faultMessageResolver.
/** * {@link WebServiceTemplateCustomizer} to set * {@link WebServiceTemplate#setFaultMessageResolver(FaultMessageResolver) * faultMessageResolver}. */
private static final class FaultMessageResolverCustomizer implements WebServiceTemplateCustomizer { private final FaultMessageResolver faultMessageResolver; private FaultMessageResolverCustomizer(FaultMessageResolver faultMessageResolver) { this.faultMessageResolver = faultMessageResolver; } @Override public void customize(WebServiceTemplate webServiceTemplate) { webServiceTemplate.setFaultMessageResolver(this.faultMessageResolver); } } }