Функции перегрузки с различными @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 функцию и проверяю параметры и ссылаюсь на то, что мне нужно от этого (это то, что я использовал до того, как я разместил вопрос). Но то, что я ищу, возможно, использует силу фреймворков, чтобы спасти меня.
Спасибо.
Ответы
Ответ 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, чтобы направить его на правильный метод.