1

有没有办法将查询参数“x”包含在默认值的 URL 中,如果它被省略,因为目前我需要做的是下面的事情,我必须为每个具有默认值的参数执行此操作;有一个更好的方法吗?我正在使用泽西岛 1.12 版

    public Response getResponse(@DefaultValue("test") @QueryParam("x") String x)
                UriBuilder uriBuilder = UriBuilder.fromUri(uriInfo.getRequestUri());
                uriBuilder = uriBuilder.replaceQueryParam(x);
                QueryContext.setUrl(uriBuilder.build().toString());

谢谢

4

1 回答 1

0

我不知道执行此操作的标准 Jersey 方法,但您可以使用 AOP 拦截该方法并执行以下操作:

public class UpdateQueryParamInterceptor implements MethodInterceptor {

  public Object invoke(MethodInvocation method) throws Throwable {
    UriBuilder builder = null;
    for (Object arg: method.getArguments()) {
      if (arg instanceof UriInfo) {
        UriInfo info = (UriInfo)arg;
        builder = UriBuilder.fromUri(info.getRequestUri());
      }
    }

    Annotation[][] annotations = method.getMethod().getParameterAnnotations();
    for (int i = 0; i < method.getArguments().length; i++) {
      if (annotations[i].length > 0) {
        DefaultValue def = null;
        QueryParam param = null;

        for (Annotation annotation: annotations[i]) {
          if (annotation instanceof DefaultValue) {
            def = (DefaultValue)annotation;
          } else if (annotation instanceof QueryParam) {
            param = (QueryParam)annotation;
          }
        }
        if ((null != def) && (null != param)) {
          builder = builder.replaceQueryParam(param.value(), method.getArguments()[i]);
        }
      }
    }

    //Do something with builder.build().toString()); 

    return method.proceed();
  }

}

我不确定QueryContext你的代码中有什么类 - 但你也可以在方法中找到它并setUrl在拦截器中执行该方法......

于 2012-08-01T22:00:06.210 回答