在Play Java中构建动作

时间:2017-01-27 09:41:54

标签: java playframework

我知道我们在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
所以,我很困惑。也许我有很小的误解,所以有人能指出它吗?

感谢。

2 个答案:

答案 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。