簡體   English   中英

子資源的Jersey復用參數驗證

[英]Jersey reuse parameter validation for subresources

我必須遵循澤西島的端點結構:

/objects/
/objects/:id
/objects/:id/:field
/objects/:id/:field/:subfield

我使用的ID具有非常特定的格式,因此在向數據庫發出請求之前,我首先檢查該格式是否有效。

現在,對於每個以:id為參數的函數,我必須將此代碼放入POSTPUTGETDELETE函數中。 因此,這意味着早日返回。

if (!isIdValid(id)){
    return Response.status(Response.StatusType.BAD_REQUEST)
                   .entity("The ID you've provided is invalid")
                   .build();
}

(實際上,錯誤實體是一個包含有關錯誤的更多信息的對象)

然后,對於使用:field:subfield參數的每個函數,代碼都相似。 這種檢查和錯誤處理行為必須每次都復制。 當我開始粘貼粘貼內容時,我開始思考:應該有更好的方法嗎?

我想將:id檢查代碼放在/objects/:id級別,然后假定所有其他嵌套級別都具有有效的ID。 對於其他參數,則進一步嵌套相同。

我一直在研究使用子資源定位器,但是隨后您創建了一個返回子資源新實例的函數。 如果驗證失敗,則無法在該級別上有條件地返回Response

@Path("{id}")
function Class<ObjectFieldResource> getObjectById(@PathParam("id") String id){
    return ObjectFieldResource.class;
}

我可以開始拋出異常,但是我寧願避免這種情況,因為我並不真正認為無效輸入是一個異常

如何最好地實施這種結構? 我研究了bean驗證,但是似乎不允許我為我的特定格式+自定義錯誤響應定義驗證。

我在實現子資源的方式上是否缺少某些東西?

解決方案1

如果您可以使用regexp檢查而不是isIdValid方法,則可以這樣定義資源

@POST
@Path("objects/{id:\\d+}")
public Response doSmth(@PathParam("id") String id) {
...
}

id格式無效的情況下,調用者將具有“未找到”響應狀態,甚至沒有達到您的doSmth方法。

顯然,您可以對所有相等的路徑值使用String常量。

final static String ID_RES = "objects/{id:\\d+}";

@POST
@Path(ID_RES)
public Response postSmth(@PathParam("id") String id) {
...
}
...
@GET
@Path(ID_RES)
public Object getSmth(@PathParam("id") String id) {
...
}

還可以閱讀Path#value參數的完整說明

解決方案2

使用需要進行URI檢查的filter方法在REST服務器上創建並注冊javax.ws.rs.container.ContainerRequestFilter實現。

單個過濾器參數具有來自女巫的ContainerRequestContext類型,您可以調用getUriInfo來獲取URI和方法abortWith(Response response) ,如果資源ID驗證失敗,該方法可以用於中止調用方請求。

請參見《澤西島手冊》的第10章“過濾器和攔截器 ”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM