Джерси: запретить неуказанные параметры

Я разрабатываю REST API с Джерси как реализацию JAX-RS.

В каждом ресурсе я явно определяю ожидаемые параметры:

@GET
@Path("/someData")
public Response getSomeData(
                @QueryParam("id") final Long id,
                @QueryParam("name") final String name) {
...
}

Существует ряд фиксированных параметров, общих для всех ресурсов (например, «локаль»).

Есть ли способ (я согласен с введением зависимостей, специфичных для Джерси) я могу запретить любые параметры, которые не относятся ни к параметрам метода, ни к общим параметрам?

Так, например, если пользователь вызывает

/api/resource/someData?id=10&locale=en - он получает данные, но если он вызывает

/api/resource/someData?id=10&locale=en&fakeParam=AAA - возвращается статус 400, с содержимым, указывающим, что fakeParam является неизвестным параметром.

В настоящее время второй запрос обрабатывается так же, как и первый, а fakeParam просто игнорируется.

Думаю, описанная валидация поможет пользователям моего API раньше выявлять ошибки.


person pavel_kazlou    schedule 26.02.2014    source источник


Ответы (1)


Я не знаю, как это сделать с помощью JAX-RS, но вы можете легко создать собственное решение. Это немного громоздко, но вы можете сделать что-то вроде:

@Path("/api")
public class Service {

  @Context
  UriInfo uriInfo;

  ImmutableSet<String> commonParams = ImmutableSet.of("locale");

  @GET
  @Path("validate")
  @Produces(MediaType.APPLICATION_JSON)
  public String validate(@QueryParam("foo") String param) {
    Set<String> validParams = newHashSet(commonParams);

    class Local {};
    for (Annotation[] annotations: Local.class.getEnclosingMethod().getParameterAnnotations()) {
      for (Annotation annotation: annotations) {
        if (annotation instanceof QueryParam) {
          validParams.add(((QueryParam)annotation).value());
        }
      }
    }

    if (!difference(uriInfo.getQueryParameters().keySet(), validParams).isEmpty()) {
      //throw an unknown parameter exception
    }

    return "hello";
  }

И если вы используете Guice или какой-либо другой инструмент АОП с Джерси, вы, вероятно, могли бы поместить это в аспект s.t. вам не нужно будет добавлять шаблон к каждому методу, который вы хотите проверить.

person condit    schedule 26.02.2014
comment
Я использую Spring, поэтому теоретически ваше решение должно работать. Однако я хотел бы избежать возни с конфигурацией АОП и разработки такой пользовательской логики. - person pavel_kazlou; 26.02.2014