2010-09-02 10 views
9

Можно ли настроить метод GET для чтения переменной количества параметров URI и интерпретировать их как переменный аргумент (массив) или коллекцию? Я знаю, что параметры запроса могут быть прочитаны как список/набор, но я не могу их использовать в моем случае.Можно ли настроить метод JAX-RS с переменным количеством параметров URI?

т.д .:

@GET 
@Produces("text/xml") 
@Path("list/{taskId}") 
public String getTaskCheckLists(@PathParam("taskId") int... taskId) { 
    return Arrays.toString(taskId); 
} 

Заранее спасибо

ответ

8

Если я правильно понимаю ваш вопрос, то @Path аннотаций может принимать регулярное выражение, чтобы определить список компонентов пути. Например, что-то вроде:

@GET 
@Path("/list/{taskid:.+}") 
public String getTaskCheckLists(@PathParam("taskid") List<PathSegment> taskIdList) { 
    ...... 
} 

Там в более обширный пример here.

+0

Спасибо, это, вероятно, ближе всего я вернусь к этому, так что теперь мне просто нужно поставить там регулярное выражение, которое соответствует числу и слэша для example.com/ws/list/1 или example.com/ws/list/1/2/3/4/5/6 – zeratul021

2

Я не представляю это в качестве ответа, поскольку это только крайный кейс на currently accepted answer, который я и использовал. В моем случае (Джерси 1.19) /list/{taskid:.+} не будет работать для краевого случая нулевых переменных параметров. Изменение RegEx до /list/{taskid:.*} позаботилось об этом. См. Также this article (что, по-видимому, применимо).

Кроме того, при изменении регулярному_выражения к индикатору мощности к * (вместо +) Я также должен был иметь дело программно с делом пустых строк, как я бы перевести List<PathSegment> в List<String> (передать его в мой DB-доступ код).

Причина, по которой я переводил с PathSegment в String, заключается в том, что я не хотел, чтобы класс из пакета javax.ws.rs.core загрязнял мой код уровня доступа к данным.

Вот полный пример:

@Path("/listDirs/{dirs:.*}") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response listDirs(@PathParam("dirs") List<PathSegment> pathSegments) { 
    List<String> dirs = new ArrayList<>(); 
    for (PathSegment pathSegment: pathSegments) { 
     String path = pathSegment.getPath(); 
     if ((path!=null) && (!path.trim().equals(""))) 
      dirs.add(pathSegment.getPath()); 
    } 
    List<String> valueFromDB = db.doSomeQuery(dirs); 
    // construct JSON response object ... 
}