Справочная информация: некоторое время назад мы создали RESTful API с использованием Jersey, где мы сопоставляем uri /items.json с массивом идентификаторов json, а /items/-199IDID.json - с объектом json одного элемента.Теперь мы хотим создать список с некоторыми метаданными для каждого элемента и использовать селектор, такой как /items.data.json, похожий на слинга apache.
Пока: я только что расширил UriConnegFilter для анализаURI для дополнительных суффиксов, что-то вроде этого:
public class UriSelectorFilter extends UriConnegFilter {
protected List<String> selectors; // this list is populated in the constructor
public ContainerRequest filter(ContainerRequest request) {
super.filter(request);
// search for suffix in last path segment, see http://java.net/projects/jersey/sources/svn/content/trunk/jersey/jersey-server/src/main/java/com/sun/jersey/api/container/filter/UriConnegFilter.java?rev=5034
final String[] suffixes = segment.getPath().split("\\.");
for (int i = suffixes.length - 1; i >= 1; i--) {
final String suffix = suffixes[i];
if(selectors.contains(suffix)) {
request.getQueryParameters().putSingle("selector", suffix);
final int index = path.lastIndexOf('.' + suffix);
path = new StringBuilder(path).delete(index, index + suffix.length() + 1).toString();
suffixes[i] = "";
}
}
if (length != path.length()) {
request.setUris(
request.getBaseUri(),
request.getRequestUriBuilder().replacePath(path).build());
}
return request;
}
}
Этот фильтр отлично работает, он находит селекторную часть моего URI и добавляет параметр запроса к объекту запроса.Но в своем ресурсе я добавил атрибут @QueryParam, который заполняется только значением по умолчанию, а не добавленным значением запроса:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getItemsJSON(@DefaultValue("id") @QueryParam("selector") String selector) {
// query param is not filled with the selector that was found in the UriSelectorFilter
}
У кого-нибудь есть предложение, как я могу предоставить свой ресурс с помощью селектора, которыйбыл обнаружен?Есть ли лучший способ, чем использовать QueryParam?(Примечание: если я добавлю запрос к своему URL-адресу как «? Selector = что-то», то атрибут будет заполнен правильно.)
Любая помощь очень ценится.