Java 如何在Play 2.3中定制动作组合以记录请求和响应?

Java 如何在Play 2.3中定制动作组合以记录请求和响应?,java,playframework-2.3,Java,Playframework 2.3,我正在开发Play2.3Java应用程序,我需要一个自定义动作组合来记录请求和响应。根据我目前掌握的信息,我能够获得请求的主体,但无法得到响应: import play.libs.F; import play.mvc.Action; import play.mvc.Http; import play.mvc.Result; public class LogAction extends Action.Simple { public F.Promise<Result> cal

我正在开发Play2.3Java应用程序,我需要一个自定义动作组合来记录请求和响应。根据我目前掌握的信息,我能够获得请求的主体,但无法得到响应:

import play.libs.F;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;

public class LogAction extends Action.Simple {

    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        //Request body
        String requestBody = ctx.request().body().asText();
        //Need to get response body here
        //String responseBody = ???
        return delegate.call(ctx);
    }

}

在这种情况下,如何获取响应主体?如果在java中很难做到这一点,也可以在scala中实现,但是它必须使用java控制器方法@with annotation。

您是否尝试过类似的方法:

public class VerboseAction extends play.mvc.Action.Simple {

    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        Logger.info("Calling action for " + ctx);
        F.Promise<Result> resultPromise = delegate.call(ctx);
        resultPromise.map(result -> {
            Logger.info(result.toScala().header().status());
            Logger.info(result.toScala().body().toString());
            return result;
        });
        return resultPromise;
    }
}
正文将作为play.api.libs.iteratee.Enumerator返回。现在最困难的部分是处理这个问题。首先,您需要了解Iteratee的概念以及枚举器在其中扮演的角色。提示:将枚举数视为数据的生产者,将迭代对象视为数据的消费者

现在,在这个枚举器上,您可以运行一个Iteratee,将数据块转换为您想要的类型

坏消息是您需要实现play.api.libs.iteratee.iteratee特性。正如您所看到的,它驻留在api子包中,这意味着它是Scala世界的一部分。在这种情况下,使用Scala完成这部分任务可能会容易得多。不幸的是,我不能为您提供一些示例实现,但我希望这不会那么困难。我认为这是Java方面真正缺少的东西

    @Override
    public F.Promise<Result> call(Http.Context ctx) throws Throwable {
        Promise<Result> call = delegate.call(ctx);
        return call.map((r) -> {
            byte[] body = JavaResultExtractor.getBody(r, 0l);
            Logger.info(new String(body));
            return r;
        });
    }

您可以使用play.core.j.javaResultTextRactor从响应中提取正文。记住,getBody。。块,直到响应准备就绪,因此考虑调用OnReDeMe,而不是Map。

谢谢您的回答,但是,尽管它似乎在正确的方向上,但我得到了这个日志播放。18@2ae9a7b2而不是出于某种原因的响应主体。javaResultTextRactor.getBodyresult,0L给出超时,即使我将其从0更改为100k。