簡體   English   中英

玩! -如何為路徑片段重用通用邏輯

[英]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.

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