玩! - 如何重用路径片段的通用逻辑

时间:2015-02-23 22:09:51

标签: java model-view-controller playframework

我目前正在使用 Play 2.3 ,我必须处理类似的网址映射:

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 - Not Found )。

1 个答案:

答案 0 :(得分:0)

你说你在每个控制器函数中一次又一次地调用该方法,而不是你可以使用@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