SWS-811 - When using annotation-driven register the SoapHeaderElementMethodArgumentResolver by default

This commit is contained in:
Arjen Poutsma
2012-11-30 11:25:09 +00:00
parent 295ad0645a
commit 5d64a2a259
3 changed files with 25 additions and 10 deletions

View File

@@ -43,6 +43,7 @@ import org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMetho
import org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping;
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver;
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver;
import org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping;
@@ -117,6 +118,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
argumentResolvers.add(createBeanDefinition(MessageContextMethodArgumentResolver.class, source));
argumentResolvers.add(createBeanDefinition(XPathParamMethodArgumentResolver.class, source));
argumentResolvers.add(createBeanDefinition(SoapMethodArgumentResolver.class, source));
argumentResolvers.add(createBeanDefinition(SoapHeaderElementMethodArgumentResolver.class, source));
RuntimeBeanReference domProcessor = createBeanReference(DomPayloadMethodProcessor.class, source, parserContext);
argumentResolvers.add(domProcessor);

View File

@@ -64,6 +64,9 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter
private static final String SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME =
"org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver";
private static final String SOAP_HEADER_ELEMENT_ARGUMENT_RESOLVER_CLASS_NAME =
"org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver";
private List<MethodArgumentResolver> methodArgumentResolvers;
private List<MethodReturnValueHandler> methodReturnValueHandlers;
@@ -108,7 +111,6 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter
initMethodReturnValueHandlers();
}
@SuppressWarnings("unchecked")
private void initMethodArgumentResolvers() {
if (CollectionUtils.isEmpty(methodArgumentResolvers)) {
List<MethodArgumentResolver> methodArgumentResolvers = new ArrayList<MethodArgumentResolver>();
@@ -116,15 +118,8 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter
methodArgumentResolvers.add(new MessageContextMethodArgumentResolver());
methodArgumentResolvers.add(new SourcePayloadMethodProcessor());
methodArgumentResolvers.add(new XPathParamMethodArgumentResolver());
try {
Class<MethodArgumentResolver> soapMethodArgumentResolverClass =
(Class<MethodArgumentResolver>) ClassUtils
.forName(SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME, getClassLoader());
methodArgumentResolvers.add(BeanUtils.instantiate(soapMethodArgumentResolverClass));
}
catch (ClassNotFoundException e) {
logger.warn("Could not find \"" + SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME + "\" on the classpath");
}
addMethodArgumentResolver(SOAP_METHOD_ARGUMENT_RESOLVER_CLASS_NAME, methodArgumentResolvers);
addMethodArgumentResolver(SOAP_HEADER_ELEMENT_ARGUMENT_RESOLVER_CLASS_NAME, methodArgumentResolvers);
if (isPresent(DOM4J_CLASS_NAME)) {
methodArgumentResolvers.add(new Dom4jPayloadMethodProcessor());
}
@@ -148,6 +143,22 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter
}
}
/**
* Certain (SOAP-specific) {@code MethodArgumentResolver}s have to be instantiated by class name, in order to not
* introduce a cyclic dependency.
*/
@SuppressWarnings("unchecked")
private void addMethodArgumentResolver(String className, List<MethodArgumentResolver> methodArgumentResolvers) {
try {
Class<MethodArgumentResolver> methodArgumentResolverClass =
(Class<MethodArgumentResolver>) ClassUtils.forName(className, getClassLoader());
methodArgumentResolvers.add(BeanUtils.instantiate(methodArgumentResolverClass));
}
catch (ClassNotFoundException e) {
logger.warn("Could not find \"" + className + "\" on the classpath");
}
}
private void initMethodReturnValueHandlers() {
if (CollectionUtils.isEmpty(methodReturnValueHandlers)) {
List<MethodReturnValueHandler> methodReturnValueHandlers = new ArrayList<MethodReturnValueHandler>();

View File

@@ -42,6 +42,7 @@ import org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMetho
import org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping;
import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver;
import org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver;
import org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping;
@@ -85,6 +86,7 @@ public class AnnotationDrivenBeanDefinitionParserTest {
assertContainsInstanceOf(argumentResolvers, MessageContextMethodArgumentResolver.class);
assertContainsInstanceOf(argumentResolvers, XPathParamMethodArgumentResolver.class);
assertContainsInstanceOf(argumentResolvers, SoapMethodArgumentResolver.class);
assertContainsInstanceOf(argumentResolvers, SoapHeaderElementMethodArgumentResolver.class);
assertContainsInstanceOf(argumentResolvers, DomPayloadMethodProcessor.class);
assertContainsInstanceOf(argumentResolvers, SourcePayloadMethodProcessor.class);
assertContainsInstanceOf(argumentResolvers, Dom4jPayloadMethodProcessor.class);