How to make queryparams mandatory in Java Jersey REST?

I have a REST API that accepts 3 request parameters. When a request is called without any of the request parameters, the API executes and returns the result. How to make a request condition mandatory? How to add confirmation to check for all parameters? Also, please let me know the best approach.

+6
source share
2 answers

At a very simple level, you can simply enter HttpServletRequest and test yourself:

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

Or you can implement something more complex using AOP. Here 's a blog post about advanced options.

0
source

jersey does not provide required functionality for checking parameters out of the box. however, you can do something like implementing your own annotation to achieve it. Below is the annotation code:

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

You also need a filter, below is the 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; } } 

The example below shows how to use this annotation, so in the webservice below; file_id and count are required parameters:

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

If the required parameters are not specified in the webservice call, you will receive an error, as shown below, indicating parameter names that are missing:

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

Hope this solves your problem.

0
source

All Articles