2014-02-26 32 views
2

我正在開發REST API和Jersey作爲JAX-RS實現。Jersey:禁止未指定的參數

在每一個資源我明確定義預期的參數:

@GET 
@Path("/someData") 
public Response getSomeData(
       @QueryParam("id") final Long id, 
       @QueryParam("name") final String name) { 
... 
} 

有許多固定的參數,這是所有資源(例如「區域」)普遍。我可以禁止任何既不屬於方法參數也不屬於公共參數的參數嗎?

因此,舉例來說,如果用戶調用

/api/resource/someData?id=10&locale=en - 他得到的數據,但如果他援引

/api/resource/someData?id=10&locale=en&fakeParam=AAA - 狀態400返回,與內容指出fakeParam是未知參數。

當前第二個請求的處理方式與第一個請求的處理方式相同,並且fakeParam簡單地被忽略。

我認爲描述驗證將幫助我的API用戶更早發現錯誤。

回答

0

我不知道有什麼辦法可以用JAX-RS來做到這一點,但您可以輕鬆推出自己的解決方案。這是有點麻煩,但你可以這樣做:

@Path("/api") 
public class Service { 

    @Context 
    UriInfo uriInfo; 

    ImmutableSet<String> commonParams = ImmutableSet.of("locale"); 

    @GET 
    @Path("validate") 
    @Produces(MediaType.APPLICATION_JSON) 
    public String validate(@QueryParam("foo") String param) { 
    Set<String> validParams = newHashSet(commonParams); 

    class Local {}; 
    for (Annotation[] annotations: Local.class.getEnclosingMethod().getParameterAnnotations()) { 
     for (Annotation annotation: annotations) { 
     if (annotation instanceof QueryParam) { 
      validParams.add(((QueryParam)annotation).value()); 
     } 
     } 
    } 

    if (!difference(uriInfo.getQueryParameters().keySet(), validParams).isEmpty()) { 
     //throw an unknown parameter exception 
    } 

    return "hello"; 
    } 

如果你正在使用吉斯或澤西一些其他的AOP工具,你很可能把這個變成一個方面S.T.您不必爲每個要驗證的方法添加樣板。

+0

我使用彈簧,所以理論上你的解決方案應該工作。不過,我想避免混淆AOP配置和開發這種定製邏輯。 –