Вы можете сделать это частично поддерживаемым способом, создав RequestHandler и переопределив фактическую HandlersFactory , чтобы вернуть список, содержащий ваш обработчик запросов.Конфигурация для этого обсуждается здесь .Этот обработчик запроса будет вставлен в цепочку обработки запроса непосредственно перед InvokeMethodHandler (который является последним вызванным обработчиком запроса, и именно он фактически вызывает метод ресурса).
На основе чтения исходного кода для InvokeMethodHandler (который фактически вызывает ваш ресурс JAX / RS), вы можете получить параметры, параметры экземпляра и метода следующим образом:
// Get Method Validator from hibernate
MethodValidator validator = Validation.byProvider(HibernateValidator.class).configure()
.buildValidatorFactory().getValidator().unwrap(
MethodValidator.class);
// Extract the method parameters, object instance and method metadata from the JAX/RS internals.
Method javaMethod = null;
Object instance = null;
Object[] parameters = null;
SearchResult searchResult = context.getAttribute(SearchResult.class);
javaMethod = searchResult.getMethod().getMetadata()
.getReflectionMethod();
parameters = searchResult.getInvocationParameters();
instance = searchResult.getResource().getInstance(context);
// Use all this to perform validation...
Set<MethodConstraintViolation<Object>> violations = validator
.validateAllParameters(instance, javaMethod, parameters);
if (!violations.isEmpty()) {
// do something with the violations here
}
Это несколько странно, так как полагается на(насколько я могу судить недокументировано) детали реализации wink для получения экземпляра, параметров и метаданных (было бы неплохо, если бы они предоставили публичный способ получить эту информацию).Тем не менее, это несколько предпочтительнее, чем использование прокси, потому что вы не выводите несколько накладных расходов от отражения, которые происходят с прокси.