2012-12-06 11 views
6

मेरे पास एक आरईएसटी एपीआई है जो 3 क्वेरी पैरा स्वीकार करती है। जब क्वेरी को किसी भी क्वेरी पैरामीटर के बिना बुलाया जाता है, तो एपीआई निष्पादित करता है और परिणाम देता है। हम क्वेरीपरम को अनिवार्य कैसे बना सकते हैं? सभी पैरामीटर मौजूद हैं या नहीं, यह जांचने के लिए मैं सत्यापन कैसे जोड़ सकता हूं? इसके अलावा, कृपया मुझे सबसे अच्छा तरीका बताएं।जावा जर्सी आरईएसटी सेवाओं में क्वेरीपरैम अनिवार्य कैसे बनाएं?

उत्तर

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

नमूना नीचे दिखाता है कि कैसे यह व्याख्या का उपयोग करने, वेब सेवा नीचे में तो;

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

आशा यह आपके हल करती है file_id और गिनती अनिवार्य मानकों हैं मुसीबत।

संबंधित मुद्दे