[英]Jersey reuse parameter validation for subresources
我必須遵循澤西島的端點結構:
/objects/
/objects/:id
/objects/:id/:field
/objects/:id/:field/:subfield
我使用的ID具有非常特定的格式,因此在向數據庫發出請求之前,我首先檢查該格式是否有效。
現在,對於每個以:id
為參數的函數,我必須將此代碼放入POST
, PUT
, GET
, DELETE
函數中。 因此,這意味着早日返回。
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驗證,但是似乎不允許我為我的特定格式+自定義錯誤響應定義驗證。
我在實現子資源的方式上是否缺少某些東西?
如果您可以使用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
參數的完整說明
使用需要進行URI檢查的filter
方法在REST服務器上創建並注冊javax.ws.rs.container.ContainerRequestFilter
實現。
單個過濾器參數具有來自女巫的ContainerRequestContext
類型,您可以調用getUriInfo
來獲取URI和方法abortWith(Response response)
,如果資源ID驗證失敗,該方法可以用於中止調用方請求。
請參見《澤西島手冊》的第10章“過濾器和攔截器 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.