Skip to content

Commit 5d64a2a

Browse files
committed
SWS-811 - When using annotation-driven register the SoapHeaderElementMethodArgumentResolver by default
1 parent 295ad06 commit 5d64a2a

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

core/src/main/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping;
4444
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
4545
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
46+
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver;
4647
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver;
4748
import org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping;
4849

@@ -117,6 +118,7 @@ private void registerEndpointAdapters(Element element, Object source, ParserCont
117118
argumentResolvers.add(createBeanDefinition(MessageContextMethodArgumentResolver.class, source));
118119
argumentResolvers.add(createBeanDefinition(XPathParamMethodArgumentResolver.class, source));
119120
argumentResolvers.add(createBeanDefinition(SoapMethodArgumentResolver.class, source));
121+
argumentResolvers.add(createBeanDefinition(SoapHeaderElementMethodArgumentResolver.class, source));
120122

121123
RuntimeBeanReference domProcessor = createBeanReference(DomPayloadMethodProcessor.class, source, parserContext);
122124
argumentResolvers.add(domProcessor);

core/src/main/java/org/springframework/ws/server/endpoint/adapter/DefaultMethodEndpointAdapter.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter
6464
private static final String SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME =
6565
"org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver";
6666

67+
private static final String SOAP_HEADER_ELEMENT_ARGUMENT_RESOLVER_CLASS_NAME =
68+
"org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver";
69+
6770
private List<MethodArgumentResolver> methodArgumentResolvers;
6871

6972
private List<MethodReturnValueHandler> methodReturnValueHandlers;
@@ -108,23 +111,15 @@ protected void initDefaultStrategies() {
108111
initMethodReturnValueHandlers();
109112
}
110113

111-
@SuppressWarnings("unchecked")
112114
private void initMethodArgumentResolvers() {
113115
if (CollectionUtils.isEmpty(methodArgumentResolvers)) {
114116
List<MethodArgumentResolver> methodArgumentResolvers = new ArrayList<MethodArgumentResolver>();
115117
methodArgumentResolvers.add(new DomPayloadMethodProcessor());
116118
methodArgumentResolvers.add(new MessageContextMethodArgumentResolver());
117119
methodArgumentResolvers.add(new SourcePayloadMethodProcessor());
118120
methodArgumentResolvers.add(new XPathParamMethodArgumentResolver());
119-
try {
120-
Class<MethodArgumentResolver> soapMethodArgumentResolverClass =
121-
(Class<MethodArgumentResolver>) ClassUtils
122-
.forName(SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME, getClassLoader());
123-
methodArgumentResolvers.add(BeanUtils.instantiate(soapMethodArgumentResolverClass));
124-
}
125-
catch (ClassNotFoundException e) {
126-
logger.warn("Could not find \"" + SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME + "\" on the classpath");
127-
}
121+
addMethodArgumentResolver(SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME, methodArgumentResolvers);
122+
addMethodArgumentResolver(SOAP_HEADER_ELEMENT_ARGUMENT_RESOLVER_CLASS_NAME, methodArgumentResolvers);
128123
if (isPresent(DOM4J_CLASS_NAME)) {
129124
methodArgumentResolvers.add(new Dom4jPayloadMethodProcessor());
130125
}
@@ -148,6 +143,22 @@ private void initMethodArgumentResolvers() {
148143
}
149144
}
150145

146+
/**
147+
* Certain (SOAP-specific) {@code MethodArgumentResolver}s have to be instantiated by class name, in order to not
148+
* introduce a cyclic dependency.
149+
*/
150+
@SuppressWarnings("unchecked")
151+
private void addMethodArgumentResolver(String className, List<MethodArgumentResolver> methodArgumentResolvers) {
152+
try {
153+
Class<MethodArgumentResolver> methodArgumentResolverClass =
154+
(Class<MethodArgumentResolver>) ClassUtils.forName(className, getClassLoader());
155+
methodArgumentResolvers.add(BeanUtils.instantiate(methodArgumentResolverClass));
156+
}
157+
catch (ClassNotFoundException e) {
158+
logger.warn("Could not find \"" + className + "\" on the classpath");
159+
}
160+
}
161+
151162
private void initMethodReturnValueHandlers() {
152163
if (CollectionUtils.isEmpty(methodReturnValueHandlers)) {
153164
List<MethodReturnValueHandler> methodReturnValueHandlers = new ArrayList<MethodReturnValueHandler>();

core/src/test/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParserTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping;
4343
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
4444
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
45+
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver;
4546
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver;
4647
import org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping;
4748

@@ -85,6 +86,7 @@ public void endpointAdapters() {
8586
assertContainsInstanceOf(argumentResolvers, MessageContextMethodArgumentResolver.class);
8687
assertContainsInstanceOf(argumentResolvers, XPathParamMethodArgumentResolver.class);
8788
assertContainsInstanceOf(argumentResolvers, SoapMethodArgumentResolver.class);
89+
assertContainsInstanceOf(argumentResolvers, SoapHeaderElementMethodArgumentResolver.class);
8890
assertContainsInstanceOf(argumentResolvers, DomPayloadMethodProcessor.class);
8991
assertContainsInstanceOf(argumentResolvers, SourcePayloadMethodProcessor.class);
9092
assertContainsInstanceOf(argumentResolvers, Dom4jPayloadMethodProcessor.class);

0 commit comments

Comments
 (0)