Play Framework 2.2如何在覆盖调用操作中设置响应状态代码

时间:2013-11-20 11:05:02

标签: java playframework-2.2

我想创建一个将在某些控制器中调用以进行身份​​验证的anotation。

在2.1之前的旧游戏版本中,我使用以下代码来覆盖Play的调用操作:

public class OAuth2Action extends Action<OAuth2> {

    // ...
    @Override
    public Result call(Http.Context context) throws Throwable
    {
        if (authorization  == null )
            return unauthorized(ACCESS_TOKEN_NOT_FOUND);

        return delegate.call(context);
    }
}

它返回Result然后它可以很容易地返回未使用http状态代码401的未授权响应,如在Controller

在游戏中2.2调用方法已更改,必须返回F.Promise

我写了以下内容以使其有效:

public class OAuth2Action extends Action<OAuth2> {
    // ...
    @Override
    public F.Promise<SimpleResult> call(Http.Context context) throws Throwable {    
        if (authorization  == null ) {          
            // return unauthorized(ACCESS_TOKEN_NOT_FOUND); // Now i can't use this
            // I can set Header, Content type, cookies, BUT NOT STATUS CODE
            context.response().setHeader("Header", "test");
        }

        return delegate.call(context);
    }
}

我希望以状态代码401返回回复,您能否帮我解决此问题。

1 个答案:

答案 0 :(得分:2)

试试这个:

public class OAuth2Action extends Action<OAuth2> {
    // ...
    @Override
    public F.Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
        if (authorization  == null ) {
            return F.Promise.promise(new F.Function0<SimpleResult>() {
                @Override
                public SimpleResult apply() throws Throwable {
                    return unauthorized(ACCESS_TOKEN_NOT_FOUND);
                }
            });
        }
        return delegate.call(ctx);
    }
}