diff --git a/core/src/main/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParser.java b/core/src/main/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParser.java index 70adb900..c8ba1c76 100644 --- a/core/src/main/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParser.java +++ b/core/src/main/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParser.java @@ -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); diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/DefaultMethodEndpointAdapter.java b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/DefaultMethodEndpointAdapter.java index a75cea35..319961d2 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/DefaultMethodEndpointAdapter.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/DefaultMethodEndpointAdapter.java @@ -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 methodArgumentResolvers; private List methodReturnValueHandlers; @@ -108,7 +111,6 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter initMethodReturnValueHandlers(); } - @SuppressWarnings("unchecked") private void initMethodArgumentResolvers() { if (CollectionUtils.isEmpty(methodArgumentResolvers)) { List methodArgumentResolvers = new ArrayList(); @@ -116,15 +118,8 @@ public class DefaultMethodEndpointAdapter extends AbstractMethodEndpointAdapter methodArgumentResolvers.add(new MessageContextMethodArgumentResolver()); methodArgumentResolvers.add(new SourcePayloadMethodProcessor()); methodArgumentResolvers.add(new XPathParamMethodArgumentResolver()); - try { - Class soapMethodArgumentResolverClass = - (Class) 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 methodArgumentResolvers) { + try { + Class methodArgumentResolverClass = + (Class) 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 methodReturnValueHandlers = new ArrayList(); diff --git a/core/src/test/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParserTest.java b/core/src/test/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParserTest.java index 4b4eb618..12a50111 100644 --- a/core/src/test/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParserTest.java +++ b/core/src/test/java/org/springframework/ws/config/AnnotationDrivenBeanDefinitionParserTest.java @@ -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);