}
public Object invoke(HttpRequest request, HttpResponse httpResponse, Object resource) throws Failure, ApplicationException
{
Object[] args = injectArguments(request, httpResponse);
GeneralValidator validator = GeneralValidator.class.cast(request.getAttribute(GeneralValidator.class.getName()));
if (validator != null)
{
validator.validateAllParameters(request, resource, method.getMethod(), args);
}
Method invokedMethod = method.getMethod();
if (!invokedMethod.getDeclaringClass().isAssignableFrom(resource.getClass()))
{
// invokedMethod is for when the target object might be a proxy and
// resteasy is getting the bean class to introspect.
// In other words ResourceMethod.getMethod() does not have the same declared class as the proxy:
// An example is a proxied Spring bean that is a resource
// interface ProxiedInterface { String get(); }
// @Path("resource") class MyResource implements ProxiedInterface {
// @GET String get() {...}
// }
//
invokedMethod = interfaceBasedMethod;
}
Object result = null;
try
{
result = invokedMethod.invoke(resource, args);
}
catch (IllegalAccessException e)
{
throw new InternalServerErrorException("Not allowed to reflect on method: " + method.toString(), e);
}
catch (InvocationTargetException e)
{
Throwable cause = e.getCause();
if (validator instanceof GeneralValidatorCDI)
{
GeneralValidatorCDI.class.cast(validator).checkForConstraintViolations(request, e);
}
throw new ApplicationException(cause);
}
catch (IllegalArgumentException e)
{
String msg = "Bad arguments passed to " + method.toString() + " (";
if (args != null)
{
boolean first = false;
for (Object arg : args)
{
if (!first)
{
first = true;
}
else
{
msg += ",";
}
if (arg == null)
{
msg += " null";
continue;
}
msg += " " + arg.getClass().getName() + " " + arg;
}
}
msg += " )";
throw new InternalServerErrorException(msg, e);
}
if (validator != null)
{
validator.validateReturnValue(request, resource, method.getMethod(), result);
}
return result;
}