diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
index 97d4c1e..e4f8827 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/util/JaxrsUriBuilder.java
@@ -19,24 +19,20 @@ package org.killbill.billing.jaxrs.util;
import java.net.URI;
import java.util.Map;
+import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
-import org.killbill.billing.jaxrs.json.ProfilingDataJson;
import org.killbill.billing.jaxrs.resources.JaxRsResourceBase;
import org.killbill.billing.jaxrs.resources.JaxrsResource;
-import org.killbill.commons.profiling.Profiling;
-import org.killbill.commons.profiling.ProfilingData;
public class JaxrsUriBuilder {
public Response buildResponse(final UriInfo uriInfo, final Class<? extends JaxrsResource> theClass, final String getMethodName, final Object objectId) {
- final UriBuilder uriBuilder = UriBuilder.fromResource(theClass)
- .path(theClass, getMethodName)
- .scheme(uriInfo.getAbsolutePath().getScheme())
- .host(uriInfo.getAbsolutePath().getHost())
- .port(uriInfo.getAbsolutePath().getPort());
+ final UriBuilder uriBuilder = getUriBuilder(theClass, getMethodName).scheme(uriInfo.getAbsolutePath().getScheme())
+ .host(uriInfo.getAbsolutePath().getHost())
+ .port(uriInfo.getAbsolutePath().getPort());
final URI location = objectId != null ? uriBuilder.build(objectId) : uriBuilder.build();
return Response.created(location).build();
@@ -48,10 +44,8 @@ public class JaxrsUriBuilder {
return null;
}
- final UriBuilder uriBuilder = UriBuilder.fromResource(theClass)
- .path(theClass, getMethodName)
- .queryParam(JaxRsResourceBase.QUERY_SEARCH_OFFSET, nextOffset)
- .queryParam(JaxRsResourceBase.QUERY_SEARCH_LIMIT, limit);
+ final UriBuilder uriBuilder = getUriBuilder(theClass, getMethodName).queryParam(JaxRsResourceBase.QUERY_SEARCH_OFFSET, nextOffset)
+ .queryParam(JaxRsResourceBase.QUERY_SEARCH_LIMIT, limit);
for (final String key : params.keySet()) {
uriBuilder.queryParam(key, params.get(key));
}
@@ -63,7 +57,7 @@ public class JaxrsUriBuilder {
// Let's build a n absolute location for cross resources
// See Jersey ContainerResponse.setHeaders
final StringBuilder tmp = new StringBuilder(baseUri.substring(0, baseUri.length() - 1));
- tmp.append(UriBuilder.fromResource(theClass).path(theClass, getMethodName).build(objectId).toString());
+ tmp.append(getUriBuilder(theClass, getMethodName).build(objectId).toString());
final URI newUriFromResource = UriBuilder.fromUri(tmp.toString()).build();
final Response.ResponseBuilder ri = Response.created(newUriFromResource);
final Object obj = new Object() {
@@ -74,4 +68,20 @@ public class JaxrsUriBuilder {
};
return ri.entity(obj).build();
}
+
+ private UriBuilder getUriBuilder(final Class<? extends JaxrsResource> theClassMaybeEnhanced, final String getMethodName) {
+ final Class theClass = getNonEnhancedClass(theClassMaybeEnhanced);
+ return UriBuilder.fromResource(theClass).path(theClass, getMethodName);
+ }
+
+ private Class getNonEnhancedClass(final Class<? extends JaxrsResource> theClassMaybeEnhanced) {
+ // If Guice is proxying the class for example ($EnhancerByGuice$), we want the real class.
+ // See https://java.net/projects/jersey/lists/users/archive/2008-10/message/291
+ Class theClass = theClassMaybeEnhanced;
+ while (theClass.getAnnotation(Path.class) == null && JaxRsResourceBase.class.isAssignableFrom(theClass)) {
+ theClass = theClass.getSuperclass();
+ }
+
+ return theClass;
+ }
}