【问题标题】:Play! - how to reuse common logic for path fragment玩! - 如何重用路径片段的通用逻辑
【发布时间】:2015-04-25 09:46:09
【问题描述】:

我目前正在使用 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
    });
}

这段代码一遍又一遍地重复。到目前为止,我使用普通的旧 inheritance 并将重复的代码移到父控制器类中。它完成了工作,但它肯定不是完美的解决方案(因为我必须在每个控制器操作中调用父方法并手动检查结果)。

Play 中是否有更多的声明性方法可以自动处理 URL 片段(在我们的例子中为/api/companyId/employeeId)并将执行委托给适当的控制器,或者返回错误响应(例如 404 - Not Found)。

【问题讨论】:

    标签: java model-view-controller playframework


    【解决方案1】:

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

    【讨论】:

    • 我最终使用了@With 方法,但有一个小警告;我必须手动从 URL 解析路径参数:-/
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多