我有一個接受3個查詢參數的REST API。當查詢被調用時沒有任何查詢參數時,API會執行並返回結果。我們如何使queryparams是強制性的?我如何添加驗證來檢查所有參數是否存在?另外,請讓我知道最好的方法。如何在Java Jersey REST服務中強制使用queryparams?
6
A
回答
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"
}
希望這能解決您的問題。
相關問題
- 1. 我如何在Jersey REST Web服務中使用Google OAuth2
- 2. 如何使用Hibernate和Jersey在REST服務中進行POST
- 3. 使用CORS跨域REST/Jersey web服務
- 4. 如何使用jersey和java在REST web服務中進行身份驗證
- 5. Java Websphere上的Jersey REST服務5
- 6. java jersey rest主服務器的方法?
- 7. 使用Jersey的Java中的REST Web服務
- 8. REST風格的Web服務使用Jersey使用Java登錄
- 9. 如何在Jersey REST服務方法參數上使用jackson mixin
- 10. 在Java/Jersey/REST中使用Microsoft Translator
- 11. 使用Java/Jersey作爲REST和SOAP工作的Web服務
- 12. 使用Jersey的Java異步REST Web服務?
- 13. 如何使用Jersey Rest服務提供.jad文件?
- 14. 如何使用Jersey讀取REST式服務的POST參數?
- 15. 我該如何強制Jersey加載它的服務?
- 16. Jersey Rest服務何時啓動/關閉?
- 17. 我如何引導Jersey REST服務服務器?
- 18. 使用Jersey在Java REST風格的Web服務中生成JSON和XML響應
- 19. 如何在Jersey REST服務中模擬builder.type()。post()方法
- 20. 在Jersey REST服務中如何存儲會話ID
- 21. 在運行Jersey REST服務的Grizzly服務器中使用過濾器
- 22. 使用Proguard-obfuscated REST服務無法獲得Jersey JAX-RS資源
- 23. 如何將Json請求作爲Json對象在Jersey Rest服務中使用
- 24. 從Android連接到Jersey REST Web服務
- 25. 使用oAuth 2.0來保護基於Jersey的REST服務
- 26. Jersey REST風格的服務,錯誤500
- 27. 適用於REST風格的Web服務的Java Jersey
- 28. 在java中驗證REST API服務
- 29. 如何使用REST服務
- 30. 使用Jersey發送REST Web服務的HashMap