2013-05-16 2 views
0

Rest-api, который мы строим, нам нужна какая-то система фильтрации, чтобы предотвратить передачу слишком большого количества (бесполезных) данных нашему клиенту. Использование @MatrixParameter похоже на приятное решение, поскольку это позволяет читаемый способ фильтровать на нескольких «уровнях» URIКарта как возвращаемый тип @MatrixParameter

Однако в нашем api у нас есть поля, которые наши клиенты хотели бы фильтровать, на которых не определены на компиляции (и может быть разным для каждого клиента). Это делает невозможным спецификацию этих полей в аннотации @matrixParam.

Так я надеялся, что будет какой-то способ, чтобы использовать карту как получение «боб» объект

т.е. когда я делаю GET на

https://api.example.com/rest/filtered_get;param1=value1;param2=value2/optional/continuation/of/uri/

закончится вверх с на карте, содержащей param1, param2 как ключи и значение1 и значение2 как значения

@Get() 
@Path("filtered_get") 
public Response getter(@matrixParam("") HashMap<String, String/Object>parameters) { 
    //doStuffWiththeParameters; 
} 

Услуга выполняется cxf

ответ

0

Я думаю, что у меня это получилось.

Хитрость заключается в том, чтобы использовать PathSegment переменную

usinge код следующим образом:

@Path("/filter{reference_to_pathParam}") 
public RestEntityService<T> search(@PathParam("reference_to_pathParam") PathSegment p) { 
MultiValuedMap<String,String> matrix = p.getMatrixParameters(); 
// doStuff with the matrix parameters 
} 

позволяет использовать неуказанные параметры матрицы в вашем URI, как:

https://api.example.com/rest/../filter;field=value;field2=value2/rest/of/the/URI/

и получить tho se полей в матрице (карта)

Обратите внимание, что я использую явный путь для этого фильтра. Это связано с тем, что если я буду использовать что-то вроде @path ("/ {filter}") в качестве аннотации, это будет мешать другим селекторам, использующим pathparameters.

Отметить это как ответ еще, потому что я не знаю, могут ли быть лучшие/чистые способы сделать это.

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