泽西岛:禁止未指明的参数

时间:2014-02-26 14:00:20

标签: java rest jersey jax-rs jersey-2.0

我正在使用Jersey开发REST API作为JAX-RS实现。

在每个资源中,我明确定义了预期的参数:

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

有许多固定参数,这些参数对于所有资源都是通用的(例如“locale”)。

有没有办法(我可以引入特定于Jersey的依赖项)我可以禁止任何既不属于方法参数也不属于公共参数的参数?

例如,如果用户调用

/api/resource/someData?id=10&locale=en - 他获取数据,但如果他调用

/api/resource/someData?id=10&locale=en&fakeParam=AAA - 返回状态400,其中的内容表明fakeParam是未知参数。

目前第二个请求的处理方式与第一个请求的处理方式相同,只是忽略了fakeParam

我认为所描述的验证将帮助我的API用户更早发现错误。

1 个答案:

答案 0 :(得分:0)

我不知道如何使用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或其他一些AOP工具,你可能会把它放到一个方面。您不必为每个要验证的方法添加样板。