SWS-811 - When using annotation-driven register the SoapHeaderElementMethodArgumentResolver by default
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user