Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/ResourceLocator.java =================================================================== --- resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/ResourceLocator.java (revision 1202) +++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/ResourceLocator.java (working copy) @@ -1,5 +1,13 @@ package org.jboss.resteasy.core; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.jboss.resteasy.specimpl.UriInfoImpl; import org.jboss.resteasy.spi.ApplicationException; import org.jboss.resteasy.spi.HttpRequest; @@ -16,12 +24,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.concurrent.ConcurrentHashMap; - /** * @author Bill Burke * @version $Revision: 1 $ @@ -55,6 +57,36 @@ } + private static final String PROXY_PATTERN = "$Proxy"; + private static final String PROXIED_METHOD_PATTERN = "\\$Proxy\\d+\\..*$"; + private static final String REMOVE_PROXY_HEADER_PATTERN = "\\$Proxy\\d+\\."; + + private void extractMethodFromProxy(Object proxy) { + Method candidateMethods[] = proxy.getClass().getDeclaredMethods(); + Pattern proxiedMethodPattern = Pattern.compile(PROXIED_METHOD_PATTERN); + + for (int i = 0; i < candidateMethods.length; i++) { + Matcher proxiedMethodPatternMatcher = proxiedMethodPattern + .matcher(candidateMethods[i].toString()); + if (proxiedMethodPatternMatcher.find()) { + String candidateMethod = proxiedMethodPatternMatcher.group(); + candidateMethod = candidateMethod.replaceAll( + REMOVE_PROXY_HEADER_PATTERN, ""); + candidateMethod = candidateMethod.replaceAll("\\(", ".") + .replaceAll("\\)", "."); + Pattern candidateMethodPattern = Pattern + .compile(candidateMethod); + Matcher candidateMethodPatternMatcher = candidateMethodPattern + .matcher(method.toString()); + if (candidateMethodPatternMatcher.find()) { + method = candidateMethods[i]; + } + } + } + + } + + protected Object createResource(HttpRequest request, HttpResponse response, Object locator) { UriInfoImpl uriInfo = (UriInfoImpl) request.getUri(); @@ -62,6 +94,10 @@ try { uriInfo.pushCurrentResource(locator); + if (locator.getClass().getCanonicalName().contains(PROXY_PATTERN)) { + extractMethodFromProxy(locator); + } + Object subResource = method.invoke(locator, args); warnIfJaxRSAnnotatedFields(subResource);