Должен ли я использовать @QueryParam или @BeanParam в JAX-RS?

Я рассматриваю два варианта обработки параметров запроса/запроса:

  • Сопоставить индивидуальные параметры с соответствующими параметрами метода:
@GET
public String blah(@QueryParam("testParam") String testParam) {

}
  1. Сопоставьте все параметры со свойствами Java bean:
@GET
public String blah(@BeanParam RequestParamBean bean) {

}

Второй вариант кажется более привлекательным, поскольку он позволяет перемещать и отделять логику проверки входных параметров запроса от метода blah, основной задачей которого является обработка и делегирование валидации валидатору в случае высокой степени развязки ( а также принцип SOLID, верно?).

Однако большинство примеров, которые я вижу (фактически, существующий проект, над которым я работаю), используют только первый вариант. Мне интересно, есть ли причина, почему второй вариант широко не используется? Есть ли подводные камни? Это анти-шаблон? Это против какой-либо лучшей практики?

Ответ 1

Аннотация @BeanParam была введена в JAX-RS 2.0 в качестве агрегатора параметров (что означает, что ее нельзя использовать в JAX-RS 1.0).


Идея аннотации @BeanParam заключается в том, чтобы иметь класс Java для агрегирования параметров, аннотированных аннотациями @XxxParam. Следующие аннотации @XxxParam могут использоваться для аннотирования полей класса агрегатора параметров:

Помимо полей, аннотированных аннотациями @XxxParam, класс агрегатора параметров может иметь поля, аннотированные аннотацией @Context. Для получения списка типов, которые могут быть введены с аннотацией @Context, проверьте этот ответ.


Я считаю это просто вопросом удобства и предпочтения разработчиков. Во многих ситуациях класс для агрегирования параметров не требуется. Использование аннотаций @XxxParam в параметрах метода очень удобно.

Но когда вам нужно повторно использовать параметры в разных методах или метод имеет много параметров, аннотированных аннотациями @XxxParam, @BeanParam подход @BeanParam.


В своем вопросе вы упомянули принцип SOLID. Но не забывай принцип KISS :)

Начните с аннотаций @XxxParam в параметрах вашего метода и не злоупотребляйте аннотацией @BeanParam пытаясь решить проблему, которой у вас нет. Вы всегда можете реорганизовать свой код, чтобы создать класс агрегатора параметров, если вам это нужно.