玩! - 如何重用路径片段的通用逻辑
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
});
}
这段代码一遍又一遍地重复。到目前为止,我使用了普通的旧 继承 并将重复代码移动到父控制器 class 中。它完成了工作,但它肯定不是完美的解决方案(因为我必须在每个控制器操作中调用父方法并手动检查结果)。
Play 中是否有一些更具声明性的方法可以自动处理 URL 的片段(在我们的例子中是 /api/companyId/employeeId
)并将执行委托给适当的控制器,或者 return错误响应(例如 404 - 未找到)。
你说你在每个控制器函数中一次又一次地调用该方法你可以使用 @With
annotation.For ex
创建一个classCheckUrl.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)
放入 class 以应用其所有功能。
@With(CheckUrl.class)
public class MyController extends Controller {
}
和特定功能
public class MyController extends Controller {
@With(CheckUrl.class)
public static Result index() {
}
}
在上述情况下 CheckUrl.java 在控制器中的函数之前被调用
我目前正在使用 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
});
}
这段代码一遍又一遍地重复。到目前为止,我使用了普通的旧 继承 并将重复代码移动到父控制器 class 中。它完成了工作,但它肯定不是完美的解决方案(因为我必须在每个控制器操作中调用父方法并手动检查结果)。
Play 中是否有一些更具声明性的方法可以自动处理 URL 的片段(在我们的例子中是 /api/companyId/employeeId
)并将执行委托给适当的控制器,或者 return错误响应(例如 404 - 未找到)。
你说你在每个控制器函数中一次又一次地调用该方法你可以使用 @With
annotation.For ex
创建一个classCheckUrl.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)
放入 class 以应用其所有功能。
@With(CheckUrl.class)
public class MyController extends Controller {
}
和特定功能
public class MyController extends Controller {
@With(CheckUrl.class)
public static Result index() {
}
}
在上述情况下 CheckUrl.java 在控制器中的函数之前被调用