2016-04-07 16 views
1

私はドキュメントが言うだけのようPlayFrameworkでカスタムページを実装しました:コールを手動でPlayFrameworkのカスタムエラーページ

public class ErrorHandler extends DefaultHttpErrorHandler { 

    @Inject 
    public ErrorHandler(Configuration configuration, Environment environment, OptionalSourceMapper sourceMapper, Provider<Router> routes) { 
     super(configuration, environment, sourceMapper, routes); 
    } 

    @Override 
    public F.Promise<Result> onClientError(Http.RequestHeader requestHeader, int errorCode, String message) { 
     Logger.debug("Error: onClientError : " + errorCode + ", message: " + message); 
     return super.onClientError(requestHeader, errorCode, message); 
    } 

    @Override 
    public F.Promise<Result> onServerError(Http.RequestHeader request, Throwable exception) { 
     Logger.debug("Error: onServerError general"); 
     return F.Promise.pure(redirect(com.company.routes.ErrorController.serverErrorPage())); 
    } 

    @Override 
    protected F.Promise<Result> onBadRequest(Http.RequestHeader request, String message) { 
     Logger.debug("Error: onBadRequest, message: " + message); 
     return F.Promise.pure(redirect(com.company.routes.ErrorController.badRequestPage())); 
    } 

    @Override 
    protected F.Promise<Result> onForbidden(Http.RequestHeader request, String message) { 
     Logger.debug("Error: onForbidden, message: " + message); 
     return F.Promise.pure(redirect(com.company.routes.ErrorController.forbiddenPage())); 
    } 

    @Override 
    protected F.Promise<Result> onNotFound(Http.RequestHeader request, String message) { 
     Logger.debug("Error: onNotFound, message: " + message); 
     return F.Promise.pure(redirect(com.company.routes.ErrorController.notFoundPage())); 
    } 

    @Override 
    protected F.Promise<Result> onOtherClientError(Http.RequestHeader request, int statusCode, String message) { 
     Logger.debug("Error: onOtherClientError, message: " + message); 
     return F.Promise.pure(redirect(com.company.routes.ErrorController.errorDefaultPage())); 
    } 
} 

カスタムページは、エラーがフレームワーク自体によってスローされた場合に効果的です。

コントローラからのエラーページにリダイレクトする際に問題があります。私がエンドポイントを呼び出すとき:

public Result contact() { 
    return Results.forbidden("Forbidden"); 
} 

ErrorHanderのエラーページは表示されません。私は "禁止された"テキストしか見ることができません。

私のカスタムエラーページを明示的にリダイレクトせずに表示するにはどうすればよいですか?

答えて

0

クライアントエラーを目的の要素に直接注入する方法が見つかりました。良い点だこと

class SomeElement { 

    private final DefaultHttpErrorHandler errorHandler; 

    @Inject 
    public SomeElement(DefaultHttpErrorHandler errorHandler) { 
     this.errorHandler = errorHandler; 
    } 

    public CompletionStage<Result> onAuthFailure(final Http.Context context, 
               final Optional<String> content) { 
     return this.errorHandler.onClientError(context.request(), Http.Status.FORBIDDEN, "You don't have required permissions."); 
    } 
} 
1

私は同様の問題があったと私はonClientErrorをオーバーライドし、別のHTTPステータスコードに切り替えると、それを解決:

public class ErrorHandler extends DefaultHttpErrorHandler { 

    @Inject 
    public ErrorHandler(Configuration configuration, Environment environment, 
     OptionalSourceMapper sourceMapper, Provider<Router> routes) { 
     super(configuration, environment, sourceMapper, routes); 
    } 

    @Override 
    public Promise<Result> onClientError(RequestHeader request, int statusCode, 
     String message) { 
    switch (statusCode) { 
    case Http.Status.BAD_REQUEST: 
     Logger.info(CLASS_NAME + ".onBadRequest: " + message); 
     return Promise.<Result> pure(
       Results.badRequest(views.html.error.render("Bad request"))); 
    case Http.Status.NOT_FOUND: 
     Logger.info(CLASS_NAME + ".onNotFound: Requested page \"" 
       + request.uri() + "\" couldn't be found."); 
     return Promise.<Result> pure(
       Results.notFound(views.html.error.render("Requested page \"" 
         + request.uri() + "\" couldn't be found."))); 
    case Http.Status.FORBIDDEN: 
     Logger.info(CLASS_NAME + ".onForbidden: " + message); 
     return Promise.<Result> pure(Results 
       .forbidden("You're not allowed to access this resource.")); 
    default: 
     Logger.info(CLASS_NAME + ".onClientError: HTTP status code " 
       + statusCode + ", " + message); 
     return Promise.<Result> pure(Results.status(statusCode, 
       views.html.error.render("Internal server error"))); 
    } 
    } 

    @Override 
    public Promise<Result> onServerError(RequestHeader request, 
     Throwable exception) { 
    Logger.info(CLASS_NAME + ".onServerError: Internal server error", 
      exception); 
    return Promise.<Result> pure(Results.internalServerError(
      views.html.error.render("Internal server error"))); 
    } 

} 

は、多分それはプレイのドキュメントでも、エラーですか?少なくともHttpErrorHandlerインターフェイスでは、onServerErrorまたはonClientErrorhttps://www.playframework.com/documentation/2.4.0/api/java/play/http/HttpErrorHandler.html)以外の方法については説明しません。

+0

:その後、私は同じようにそれを呼び出すことができます

public class ErrorHandler extends DefaultHttpErrorHandler { private ErrorController errorController; @Inject public ErrorHandler(Configuration configuration, Environment environment, OptionalSourceMapper sourceMapper, Provider<Router> routes, ErrorController errorController) { super(configuration, environment, sourceMapper, routes); this.errorController = errorController; } @Override public CompletionStage<Result> onServerError(Http.RequestHeader request, Throwable exception) { Logger.debug("Error: onServerError general"); return CompletableFuture.completedFuture(this.errorController.serverErrorPage()); } @Override protected CompletionStage<Result> onBadRequest(Http.RequestHeader request, String message) { Logger.debug("Error: onBadRequest, message: " + message); return CompletableFuture.completedFuture(this.errorController.badRequestPage()); } @Override protected CompletionStage<Result> onForbidden(Http.RequestHeader request, String message) { Logger.debug("Error: onForbidden, message: " + message); return CompletableFuture.completedFuture(this.errorController.forbiddenPage()); } @Override protected CompletionStage<Result> onNotFound(Http.RequestHeader request, String message) { Logger.debug("Error: onNotFound, message: " + message); return CompletableFuture.completedFuture(this.errorController.notFoundPage()); } @Override protected CompletionStage<Result> onOtherClientError(Http.RequestHeader request, int statusCode, String message) { Logger.debug("Error: onOtherClientError, message: " + message); return CompletableFuture.completedFuture(this.errorController.errorDefaultPage()); } } 

:私は解決策を(フレームワーク2.5を再生する)以下になってしまいました。しかし、DefaultHttpErrorHandlerの基礎となる実装を確認すると、onClientErrorの呼び出しを既に他のメソッドにリダイレクトしていることに気づくでしょう。 onBadRequest、onForbidden。 私の問題は、結果を返すにもかかわらずです。禁じられた()。要求はカスタムErrorHandlerによって捕捉されていません。 –

+0

あなたは正しいようです。おそらくそれはPlay 2.5で動作するかもしれません - 彼らは2.4と比較してDefaultHttpErrorHandlerで多くを変えました。 – Kris

関連する問題