Подтвердить что ты не робот

Функции перегрузки с различными @QueryParams

Я хотел бы иметь несколько функций для одного и того же пути GET.

Также я хотел бы, чтобы мой веб-сервис "находил" эти функции тогда и только тогда, когда параметры запроса соответствуют параметрам в строке URL.

Например:

У меня есть Path("/myGET")

И для этого пути я хотел бы иметь 2 функции:

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@QueryParam("entityId") Integer entityId)
{
    ...
}

И

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(){
    ...
}

Сейчас я получаю сообщение об ошибке:

SEVERE: Следующие ошибки и предупреждения были обнаружены в классах ресурсов и/или поставщиков:   SEVERE: конфликт типа медиа. Методы ресурсов public javax.ws.rs.core.Response <... > . GetTagSets (java.lang.Integer) и public javax.ws.rs.core.Response <... > . GetTagSets (java.lang. Integer, java.lang.Integer) может создавать один и тот же тип носителя   SEVERE: конфликт типа медиа. Методы ресурсов public javax.ws.rs.core.Response <... > . GetTagSets() и public javax.ws.rs.core.Response <... > . GetTagSets (java.lang.Integer, java. lang.Integer) может создавать один и тот же тип носителя

Итак, сначала: Есть ли способ достичь того, что я хочу здесь сделать.

второй: Если это доступно, существует ли способ, по которому будет найден путь, если и только если параметры запроса соответствуют именно тому, что запрашивается в функции? например, если тот же путь будет вызываться с помощью @QueryParam("differentParam"), он не достигнет какой-либо из двух функций.

В-третьих: Если нет способа сделать это с Джерси, есть ли способ сделать это с любой другой работой рамы?

ВАЖНО: Поскольку люди, которые отвечают на вопрос, думают, что я ищу работу, а не решение. сегодня я использую 1 функцию и проверяю параметры и ссылаюсь на то, что мне нужно от этого (это то, что я использовал до того, как я разместил вопрос). Но то, что я ищу, возможно, использует силу фреймворков, чтобы спасти меня.

Спасибо.

4b9b3361

Ответ 1

Ресурс однозначно определяется его контуром, а не его параметрами. Два ресурса, которые вы определили, имеют один и тот же путь. Вы можете либо определить новые пути для каждого из них, как /myGet/entity, /myGet/, /myGet/differentParam; или используйте один путь как /myGet/ и проверьте параметры запроса следующим образом:

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@Context HttpServletRequest request){

       ...

       if (request.getParameterMap().isEmpty()) {
           // then you have no query params, implement as there are no query params
       } else {
           String queryParam = request.getQueryString();
           // check queryParam, and add another if else statements, implement
       }

       ...

}

Ответ 2

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

(Работа вокруг подхода) Если все, что вам нужно, - это разоблачение одной конечной точки с несколькими параметрами запроса для клиента, а реализация кода не имеет значения, вы можете использовать перехватчики. прочитайте параметр запроса и измените URI, чтобы направить его на правильный метод.