Created
April 16, 2012 07:46
-
-
Save jkuipers/2396975 to your computer and use it in GitHub Desktop.
Spring-WS MethodArgumentResolver for Groovy-based endpoints supporting GPathResult params
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import groovy.util.XmlSlurper; | |
import groovy.util.slurpersupport.GPathResult; | |
import java.util.List; | |
import java.util.Properties; | |
import javax.xml.transform.Source; | |
import javax.xml.transform.sax.SAXResult; | |
import org.springframework.beans.factory.NoSuchBeanDefinitionException; | |
import org.springframework.context.ApplicationListener; | |
import org.springframework.context.event.ContextRefreshedEvent; | |
import org.springframework.core.MethodParameter; | |
import org.springframework.ws.context.MessageContext; | |
import org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter; | |
import org.springframework.ws.server.endpoint.adapter.method.MethodArgumentResolver; | |
import org.springframework.ws.server.endpoint.annotation.RequestPayload; | |
import org.springframework.xml.transform.TransformerObjectSupport; | |
public class GPathResultMethodArgumentResolver extends TransformerObjectSupport | |
implements MethodArgumentResolver, ApplicationListener<ContextRefreshedEvent> { | |
private Properties namespaces = new Properties(); | |
public GPathResultMethodArgumentResolver() { | |
this.namespaces.put("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); | |
} | |
public GPathResultMethodArgumentResolver(Properties namespaces) { | |
this(); | |
this.namespaces.putAll(namespaces); | |
} | |
@Override | |
public boolean supportsParameter(MethodParameter parameter) { | |
return parameter.getParameterAnnotation(RequestPayload.class) != null && | |
(parameter.getParameterType().equals(GPathResult.class) || | |
parameter.getParameterType().equals(Object.class)); // Object means 'def' support for Groovy | |
} | |
@Override | |
public Object resolveArgument(MessageContext messageContext, MethodParameter parameter) throws Exception { | |
Source source = messageContext.getRequest().getPayloadSource(); | |
if (source == null) return null; | |
XmlSlurper slurper = new XmlSlurper(); | |
transform(source, new SAXResult(slurper)); | |
GPathResult doc = slurper.getDocument(); | |
doc.declareNamespace(this.namespaces); | |
return doc; | |
} | |
@Override | |
public void onApplicationEvent(ContextRefreshedEvent event) { | |
DefaultMethodEndpointAdapter endpointAdapter = event.getApplicationContext().getBean(DefaultMethodEndpointAdapter.class); | |
if (endpointAdapter == null) { | |
throw new NoSuchBeanDefinitionException(DefaultMethodEndpointAdapter.class, | |
"Are you missing <ws:annotation-driven/> in your Spring-WS config xml?"); | |
} | |
List<MethodArgumentResolver> resolvers = endpointAdapter.getMethodArgumentResolvers(); | |
if (!resolvers.contains(this)) { | |
resolvers.add(this); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment