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

私はこれを行うための標準的なジャージーの方法を知りませんが、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 に答える