[英]Play! - how to reuse common logic for path fragment
我目前正在使用Play 2.3,並且必須處理類似的URL映射:
GET /api/companyId/employeeId/tasks
GET /api/companyId/employeeId/timesheets
etc.
在每個GET中,我需要執行類似的邏輯:
public Promise<Result> getEmployeeTimesheets(Long companyId, Long employeeId) {
return promise(() -> {
if (!companyRepository.one(companyId).isPresent()) {
return notFound("Company doesn't exist");
}
if (!employeeRepository.one(employeeId).isPresent()) {
return notFound("Employee doesn't exist");
}
if (!employeeRepository.employeeWorksForCompany(companyId, employeeId)) {
return forbidden("Employee doesn't work for this company");
}
// some actual logic here
});
}
此代碼一遍又一遍地重復。 到目前為止,我使用了普通的舊繼承 ,並將重復的代碼移到了父控制器類中。 它可以完成工作,但是肯定不是完美的解決方案(因為我必須在每個控制器操作中調用父方法並手動檢查結果)。
Play中是否有其他更具聲明性的方法可以自動處理URL片段(在本例中為/api/companyId/employeeId
),然后將執行委派給適當的控制器,或者返回錯誤響應(例如404-未找到)。
您說您在每個控制器函數中都@With
調用該方法,而可以使用@With
注釋。
創建一個類CheckUrl.java
public class CheckUrl extends play.mvc.Action.Simple {
public F.Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
String host = request().uri();
if (condition one satisfied) {
return F.Promise.pure(redirect("/someurl"));
}else if (condition two satisfied){
return F.Promise.pure(redirect(controllers.routes.SomeController.index()));
}
}
將@With(CheckUrl.class)
放在類中以應用於其所有功能。
@With(CheckUrl.class)
public class MyController extends Controller {
}
並針對特定功能
public class MyController extends Controller {
@With(CheckUrl.class)
public static Result index() {
}
}
在上述情況下,CheckUrl.java在控制器中的功能之前被調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.