Java именованные / необязательные параметры с использованием аннотации? - PullRequest
4 голосов
/ 07 июля 2011

В RESTeasy это ...

@GET
@Path("request")
public String requestJson(@QueryParam("arg1") @DefaultValue("") String arg1,
                          @QueryParam("arg2") @DefaultValue("0") Integer arg2);

... позволяет определить любое подмножество параметров, определенных в сигнатуре метода.Конечно, тогда можно использовать этот же шаблон для любой сигнатуры метода, например, такой:

@Method
public String requestJson(@OptionalParameter("arg1") @DefaultValue("") String arg1,
                          @OptionalParameter("arg2") @DefaultValue("0") Integer arg2);

Возможно ли это сделать?Если так, то как?

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Прежде всего, то, что сказал @laz, было совершенно верно. Это возможно в RESTEasy, потому что RESTEasy управляет вызовами вашего класса.

Я думаю, что уместным вопросом здесь является то, как вы ожидаете, что вызов requestJson () будет выглядеть. Некоторые примеры: requestJson(1) и requestJson("String") против чего-то вроде requestJson(null, 1) и requestJson("String", null).

Есть пять способов справиться с этим:

  1. Наименее автоматизированный способ (но, в конечном счете, лучший способ): напишите варианты методов вручную или настройте IDE для их генерации.

  2. Возьмите на себя ответственность вызывающего абонента за установку значения на значение по умолчанию, если оно не имеет такого значения (т. Е. Вызывающий абонент определяет "Я вызываю метод, который имеет"

  3. Перехватите вызов requestJson () и подключите отсутствующие значения по мере необходимости (это приводит к некоторому грязному отражению или генерации кода во время выполнения voodoo; это возможно, но это не будет простым - в основном вы строите ваша собственная библиотека AOP, которая будет управлять всеми вызовами requestJson ()).

  4. Подключаемый модуль к цепочке компилятора / сборки для генерации необходимых методов, т. Е .:

    public String requestJson() { requestJson("", 0); }
    public String requestJson(String arg1) { requestJson(arg1, 0); }
    public String requestJson(Int arg2) { requestJson("", arg2); }
    public String requestJson(String arg1, Int arg2) {...}
    

    (Это похоже на то, что обсуждается здесь )

  5. Добавьте код для определения отсутствующих значений в начало вашей реализации requestJson. Это включит только такие вещи, как requestJson(null, 1), и это, вероятно, не то, что вы ищете (так как требует дополнительной передачи в requestJson ()). Может быть возможно извлечь котельную плиту в библиотеку.

3 голосов
/ 07 июля 2011

Аннотации в примере RESTEasy возможны из-за того, что объектом управляет инфраструктура RESTEasy. Он может проверить метод и определить, как его вызывать, основываясь на этих аннотациях. Можно создавать любые аннотации, которые вы хотите, главное, чтобы код, вызывающий метод, должен был знать об аннотациях и о том, как их обрабатывать.

...