Я ищу хороший шаблон для обеспечения пользовательской проверки ввода для служб Resteasy.
Допустим, у меня есть этот сервис:
@Local
@Path("/example")
public interface IExample {
public Response doSomething ( @QueryParam("arg1") String arg1, @QueryParam("arg2") Integer arg2);
}
, который я реализовал:
@Stateless
public class Example implements IExample {
@Override
public Response doSomething ( String arg1, Integer arg2 ) { ... }
}
Какова лучшая практика для проверки arg1 и arg2?
Мои идеи:
- Проверка внутри метода doSomething (...).Недостаток: когда я добавлю какой-нибудь параметр (например, arg3) в будущем, я могу легко забыть проверить его.
- В пользовательском javax.servlet.Filter.Недостаток: я не могу получить доступ к arg1 и arg2 там, поскольку они еще не проанализированы средой Resteasy.
Я придумал эту концепцию:
public class ExampleValidator implements IExample {
public static class ValidationError extends RuntimeException { ... }
@Override
public Response doSomething ( String arg1, Integer arg2 ) {
// here do validation. In case of failure, throw ValidationError
return null;
}
}
, которую можно использовать какследующим образом:
@Stateless
public class Example implements IExample {
@Override
public Response doSomething ( String arg1, Integer arg2 ) {
try {
(new ExampleValidator()).doSomething(arg1, arg2);
} catch ( ValidationError e ) {
// return Response with 400
}
}
}
Таким образом, когда я меняю сигнатуру метода IExample.doSomething, мне приходится обновлять Validator из-за ошибки времени компиляции.Чтобы Resteasy НЕ интерпретировал ExampleValidator как сервис, я использовал resteasy.jndi.resources вместо resteasy.scan, но он не работает (Пример bean-компонента загружается после попытки resteasy использовать его во время развертывания).
Любые идеи - есть ли хорошие шаблоны проверки?Или можно как-то заставить мою концепцию работать?
РЕДАКТИРОВАТЬ: Или, что будет лучше, в Resteasy есть какой-нибудь фильтр-аналог?Какая-то схема, по которой мой метод (Filter) будет вызываться до фактической реализации, но с параметрами (arg1, arg2), уже проанализированными?
Заранее спасибо, извините за длинный пост;) Камиль