2012-12-06 11 views
6

Ich habe eine REST-API, die 3 Abfrageparameter akzeptiert. Wenn die Abfrage ohne einen der Abfrageparameter aufgerufen wird, führt die API das Ergebnis aus und gibt es zurück. Wie machen wir die Abfrageparams obligatorisch? Wie kann ich eine Validierung hinzufügen, um zu überprüfen, ob alle Parameter vorhanden sind? Bitte lassen Sie mich auch den besten Ansatz wissen.Wie mache ich Abfrageparams in Java-Jersey-REST-Diensten obligatorisch?

Antwort

0

auf einem sehr einfachen Niveau könnte man einfach die HttpServletRequest injizieren und selbst überprüfen:

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

Oder Sie können etwas aufwändigere mit AOP implementieren. Here's ein Blogpost über weitere Optionen.

0

Trikot bietet keine obligatorische Parameterüberprüfung Funktionalität sofort aus. Sie können jedoch etwas tun, um Ihre eigene Anmerkung zu implementieren. Unten ist der Annotation-Code:

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

Sie auch einen Filter benötigen, unten ist der Code:

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

Below Beispiel zeigt, wie diese Anmerkung verwenden, so in unter webservice; file_id und Zählung sind Pflichtparameter:

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

Wenn obligatorische Parameter nicht in Webservice Aufruf zur Verfügung gestellt werden, erhalten Sie einen Fehler wie unten, die Parameternamen zu erwähnen, die fehlen:

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

Hope this lösen Ihre Problem.