2013-08-27 5 views
13

Я хотел бы иметь несколько функций для одного и того же пути GET.Функции перегрузки с различными @QueryParams

Как бы я хотел, чтобы мой веб-сервис «находил» эти функции тогда и только тогда, когда параметры запроса соответствуют параметрам в строке 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: The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer) and public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type SEVERE: Producing media type conflict. The resource methods public javax.ws.rs.core.Response<...>.getTagSets() and public javax.ws.rs.core.Response <...>.getTagSets(java.lang.Integer,java.lang.Integer) can produce the same media type

Так первый: Есть ли способ добиться того, что я хочу сделать здесь ..

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

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

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

Спасибо.

+0

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

+0

Все ответы относятся к моей текущей реализации. Поэтому я понимаю, что вы не можете делать то, что я ищу с майкой ... знаете ли вы, есть ли способ сделать это с весной? – Gleeb

+0

Вы попросили один метод, имеющий разные параметры запроса, и мой ответ использует Джерси. Что именно вы ищете? Уточните свой вопрос. – anvarik

ответ

2

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

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

4

Ресурс определяется по его пути, а не по его параметрам. Два ресурса, которые вы определили, имеют один и тот же путь. Вы можете либо определить новые пути для каждого из них, как /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 
     } 

     ... 

} 
+0

Итак, ответ по-прежнему остается прежним. Невозможно делать то, что я хочу с Джерси, есть ли способ сделать это с любыми другими фреймами? – Gleeb

+0

Я не использовал никаких других рамок веб-сервисов, поэтому ничего не могу сказать о них, но действительно интересно, что вы хотите переключиться на совершенно новую структуру вместо того, чтобы реализовать еще несколько строк в методе. – anvarik

+0

Вы прыгаете на выводы, 1: вы не знаете объем моего webapp, это может быть просто POC. 2: Часть этого вопроса предназначена для обучения, а не только для решения этой проблемы. – Gleeb

Смежные вопросы