Как сделать параметры запроса обязательными в службах REST Java Jersey?

У меня есть REST API, который принимает 3 параметра запроса. Когда запрос вызывается без каких-либо параметров запроса, API выполняется и возвращает результат. Как сделать параметры запроса обязательными? Как я могу добавить проверку, чтобы проверить, присутствуют ли все параметры? Кроме того, пожалуйста, дайте мне знать лучший подход.


person Kavya    schedule 06.12.2012    source источник


Ответы (2)


На очень простом уровне вы можете просто ввести 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
}

Или вы можете реализовать что-то более сложное, используя АОП. Вот сообщение в блоге о дополнительных возможностях.

person condit    schedule 06.12.2012

jersey не предоставляет обязательной функции проверки параметров из коробки. однако вы можете сделать что-то вроде реализации собственной аннотации для достижения этой цели. Ниже приведен код аннотации:

@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;  
   }  
 }  

В приведенном ниже примере показано, как использовать эту аннотацию, поэтому в приведенном ниже веб-сервисе; file_id и count являются обязательными параметрами:

@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){  
 ;  
 }  

Если обязательные параметры не указаны в вызове веб-службы, вы получите сообщение об ошибке, как показано ниже, с указанием отсутствующих имен параметров:

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

Надеюсь, это решит вашу проблему.

person Fahad Najib    schedule 30.03.2014