2012-12-06 25 views
6

3つのクエリパラメータを受け入れるREST APIがあります。クエリパラメータのいずれも使用せずにクエリが呼び出されると、APIが実行して結果を返します。 queryparamsを必須にするにはどうすればよいですか?すべてのパラメータが存在するかどうかを検証するために検証を追加するにはどうすればよいですか?また、最善のアプローチを教えてください。Java Jersey RESTサービスでqueryparamsを必須にするにはどうすればいいですか?

@GET 
public Response example(@Context HttpServletRequest request, 
         @QueryParam("name") String name) { 
    if (null == request.getParameter("name")) { 
    ResponseBuilder builder = Response.status(404); 
    return builder.build(); 
    } 
    // Do something with name 
} 

をそれとも、AOPを使用して、より精巧な何かを実装することができます:あなただけのHttpServletRequestを注入し、自分でチェックすることができ、非常に単純なレベルでは

答えて

0

Here'sさらなるオプションについてのブログ記事。

0

ジャージーは、必須のパラメータチェック機能を提供していません。しかし、あなたはそれを達成するために独自の注釈を実装するような何かをすることができます。以下 は注釈コードです:

@Target(value = ElementType.METHOD) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface Required { 
    String[] value(); 
} 

ます。また、以下、フィルタを必要とするコードです:サンプル以下

public class RequiredParamResourceFilterFactory implements ResourceFilterFactory { 
    @Context 
    private transient HttpServletRequest servletRequest; 
    private class RequiredParamFilter implements ResourceFilter, ContainerRequestFilter { 
    private final String[] requiredParams; 
    protected List<String> parametersValueMissing; 
    private RequiredParamFilter(String[] requiredParams) { 
     this.requiredParams = requiredParams; 
    } 
    @Override 
    public ContainerRequest filter(ContainerRequest containerRequest) { 
     boolean missingMandatoryParameter = false; 
     List<String> missingParameters = new ArrayList<String>(); 
     List<String> requiredParametersValueMissing = new ArrayList<String>(); 
     List<String> URLParameters = getURLParameters(containerRequest.getQueryParameters()); 
     List<String> methodRequiredParameters = Arrays.asList(requiredParams); 
     if (methodRequiredParameters != null) { 
     for (String methodRequiredParam : methodRequiredParameters) { 
      if (URLParameters == null) { 
      missingMandatoryParameter = true; //we will check this flag before returning result set to caller 
      missingParameters.add(methodRequiredParam); 
      } else if (!URLParameters.contains(methodRequiredParam)) { 
      missingMandatoryParameter = true; //we will check this flag before returning result set to caller 
      missingParameters.add(methodRequiredParam); 
      //Add to required parameters value missing List, only if the parameter is mandatory and value is not provided 
      // in the URL 
      } else if (parametersValueMissing.contains(methodRequiredParam)) { 
      requiredParametersValueMissing.add(methodRequiredParam); 
      } 
     } 
     if (missingMandatoryParameter && requiredParametersValueMissing.size() > 0) { 
      throw new YourCustomException("Missing Parameters = " + StringHelper.ArrayToString(missingParameters) + 
       "\nParameter value missing for " + StringHelper.ArrayToString(requiredParametersValueMissing)); 
     } else if (missingMandatoryParameter) { 
      throw new YourCustomException("Missing Parameters = " + StringHelper.ArrayToString(missingParameters), MisbarErrorCode.VALIDATION_WRONG_INPUT_ERROR, "Customers"); 
     } else if (requiredParametersValueMissing != null && 
      requiredParametersValueMissing.size() > 0) { 
      throw new YourCustomException("Parameter value missing for " + StringHelper.ArrayToString(requiredParametersValueMissing)); 
     } 
     } 
     return containerRequest; 
    } 
    @Override 
    public ContainerRequestFilter getRequestFilter() { 
     return this; 
    } 
    @Override 
    public ContainerResponseFilter getResponseFilter() { 
     return null; 
    } 
    /** 
     * To fetch the parameters sent to webservice call, these will be used to find if required parameter 
     * are present or not 
     * 
     * @param queryParams the queryparams sent 
     * @return all the parameters sent in URL 
     */ 
    private List<String> getURLParameters(MultivaluedMap<String,String> queryParams) { 
     parametersValueMissing = new ArrayList<String>(); 
     List<String> arr = new ArrayList<String>(); 
     for(String key:queryParams.keySet()) 
     { 
     arr.add(key); 
     if(queryParams.get(key)==null) 
      parametersValueMissing.add(key); 
     } 
     if(!arr.isEmpty()) 
     return arr; 
     return null; 
    } 
    } 
    @Override 
    public List<ResourceFilter> create(AbstractMethod am) { 
    Required required = am.getAnnotation(Required.class); 
    if(required!=null) 
    { 
     return Collections.<ResourceFilter>singletonList(new RequiredParamFilter(required.value())); 
    } 
    return null; 
    } 
} 

ので、Webサービス以下では、このアノテーションを使用する方法を示しています。 FILE_IDとカウントは必須パラメータです:

@GET 
    @Produces(MediaType.APPLICATION_JSON+";charset=utf-8") 
    @Cacheable(isCacheable = true) 
    @Path("posts/clusters") 
    @Required({"file_id","count"}) 
    @Timed 
    public Response getClusters( 
     @QueryParam("file_id") Integer fileId, 
     @QueryParam("count") Integer count, 
     @DefaultValue("-1")@QueryParam("start_time") Long startTime){ 
; 
} 

必須パラメータは、Webサービスの呼び出しで提供されていない場合は、あなたが不足しているパラメータ名を言及し、以下のようなエラーが表示されます。

{ 
message: "Missing Parameters = file_id, count", 
errorCode: "600" 
} 

・ホープこれはあなたを解決します問題。

関連する問題