Skip to content

Instantly share code, notes, and snippets.

@jkuipers
Created April 16, 2012 07:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkuipers/2396975 to your computer and use it in GitHub Desktop.
Save jkuipers/2396975 to your computer and use it in GitHub Desktop.
Spring-WS MethodArgumentResolver for Groovy-based endpoints supporting GPathResult params
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