2012-12-06 39 views
6

我有一個接受3個查詢參數的REST API。當查詢被調用時沒有任何查詢參數時,API會執行並返回結果。我們如何使queryparams是強制性的?我如何添加驗證來檢查所有參數是否存在?另外,請讓我知道最好的方法。如何在Java Jersey REST服務中強制使用queryparams?

回答

0

一個非常簡單的水平,你可以只注入HttpServletRequest和自我檢查:

@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實現的更精緻。 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" 
} 

希望這能解決您的問題。

相關問題