Resteasy (JBoss AS 6) валидация - PullRequest
3 голосов
/ 03 июня 2011

Я ищу хороший шаблон для обеспечения пользовательской проверки ввода для служб 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?

Мои идеи:

  1. Проверка внутри метода doSomething (...).Недостаток: когда я добавлю какой-нибудь параметр (например, arg3) в будущем, я могу легко забыть проверить его.
  2. В пользовательском 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), уже проанализированными?

Заранее спасибо, извините за длинный пост;) Камиль

1 Ответ

1 голос
/ 23 февраля 2012

(1) Вероятно, самым чистым подходом является использование платформы Java EE 6 Bean Validation.Это потребует написания пользовательского перехватчика проверки.В этом случае вам придется изменить ваши методы, поэтому вместо

public Response doSomething ( String arg1, Integer arg2 )

вы будете использовать объект домена в качестве аргумента

public Response doSomething ( JAXBElement<MyDomainObject> myOJaxb )

Тогда вам нужно преобразовать запрос, чтобы онипредоставить данные в формате XML или JSON, которые могут быть автоматически преобразованы в фактический объект.

(2) Другой вариант - использовать обычный ServletFilter.

(3) Подготовить пользовательские аннотации и проверку бинов., тогда вам нужно подключить процессор пользовательских аннотаций (посмотрите на проект Lombok, как вдохновение).

(4) Самое простое решение - использовать встроенную проверку REST

@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")

но это относится к параметрам пути, а не к параметрам запроса (я думаю, но не проверял со спецификацией JAX-RS)

Ваш выбор зависит от того, насколько гибко вы используете свои интерфейсы и сколько времени у вас есть,

Если вы предложите универсальное, подключаемое к Resteasy решение, аналогичное предложенному в варианте (3), и сделаете его открытым исходным кодом на GitHub, многие будут любить вас:)

...