我知道我们在Stackoverflow中有相同类型的问题,但据我所知,这些都是用Scala编写的。 在the official documentation中,您可以看到如何撰写动作。 其实我不清楚它,但是
public class VerboseAction extends play.mvc.Action.Simple {
public CompletionStage<Result> call(Http.Context ctx) {
Logger.info("Calling action for {}", ctx);
return delegate.call(ctx);
}
以上代码与下面的代码相同?
@With(VerboseAction.class)
public Result verboseIndex() {
return ok("It works!"); }
他们写道我们必须委托给包装好的Action,但在上面的代码中调用哪个动作?
delegate.call(ctx)
是什么意思?
我知道Play的动作是Action
的一个实例,但返回值实际上是CompletionStage<Result>
,而不是Action
。
所以,我很困惑。也许我有很小的误解,所以有人能指出它吗?
感谢。
答案 0 :(得分:0)
Action
是一个工作单元,提供Result
(最后)。您的第一个代码块构造一个将执行日志语句的Action
,然后通过调用delegate
返回,这将是下一个Action
单元(另一个注释或者控制器方法)执行并调用它,在整个时间内传递上下文。
你在问题的最后部分的误解是,呼叫的返回类型不是下一个Action
进行的。它是所有Result
的最终Action
。
答案 1 :(得分:0)
我会尽力回答问题:
以上代码与下面的代码相同?
不,它实际上是用“with”注释组成两个动作。
但在上面的代码中调用哪个动作?
行动是服务对收到的请求的回应的过程。 只要对此方法的请求接收(请求映射到路径文件中的方法),就会调用此操作。
他们写道我们必须委托给包装好的Action, delegate.call(ctx)是什么意思?
委托是:
/**
* The wrapped action.
*/
"public Action<?> delegate;"
并致电:
/**
* Executes this action with the given HTTP context and returns the result.
*/
"public abstract Promise<Result> call(Context ctx) throws Throwable"
在Action类中。 所以delegate.call意味着将参数包装在行动中并返回结果。
我知道Play的Action是Action的一个实例,但返回值实际上是CompletionStage,而不是Action。
CompletionStage实际上是:“public interface CompletionStage” 它的文档描述了它:
可能异步计算的一个阶段,执行一个 另一个CompletionStage完成时动作或计算值。 阶段在计算终止时完成,但这可能 反过来触发其他依赖阶段。功能已定义 在这个界面只需几个基本形式,扩展到 一组更大的方法来捕获一系列使用方式:
由阶段执行的计算可以表示为a Function,Consumer或Runnable(使用名称包括的方法) 分别应用,接受或运行) 取决于它是否需要参数和/或产生结果。 例如,{@ code stage.thenApply(x - &gt; square(x))。thenAccept(x - &gt; System.out.print(x))。thenRun(() - &gt; System.out.println())}。一个 附加形式(撰写)应用阶段的功能 他们自己,而不是他们的结果。
此
“可能异步计算的一个阶段,执行动作或 在另一个CompletionStage完成时计算一个值。“
和
“由一个阶段执行的计算可以表示为一个函数, 消费者,或Runnable“
清除执行某些计算的是function,Consumer或Runnable。你实际上正在撰写动作并返回
return ok("It works!");
不是CompletionStage。