nikkofu
nikkofu

Reputation: 15

Custom Error Page in PlayFramework2.4.x

I did these and still can't see my custom page, please help,

  1. Added MyGlobal.java extends GlobalSettings

  2. Added onHandlerNotFound to override:

    @Override public F.Promise<Result> onHandlerNotFound(RequestHeader request) { Logger.error("onHandlerNotFound!"); return Promise.<Result> pure(Results.internalServerError(views.html.page404.render())); }

  3. Added application.global = "MyGlobal" in application.conf

But nothing happends, play2.4.6 still runs out the default page from devNotFound.scala.html in playframework source folder of framework/play/src/main/scala/views/defaultpages/

Please help.

Upvotes: 0

Views: 471

Answers (3)

nikkofu
nikkofu

Reputation: 15

enter image description here

    @Override
protected F.Promise<Result> onNotFound(RequestHeader request, String message) {
    Logger.debug("onNotFound: " + message);
    return Promise.<Result> pure(Results
            .ok(views.html.admin.page404.render(request.method(), request.uri())));
}

Thanks for help, it really does work in dev env..

I already had the MyErrorHandler.java but not overriding the onNotFound function, because i was almost lost in the extending GlobalSettings's onHandlerNotFound.

Upvotes: 0

nikkofu
nikkofu

Reputation: 15

public class Global extends GlobalSettings {

    @Override
    public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
        return Promise.<SimpleResult>pure(internalServerError(views.html.page404.render()));
    }
}

Upvotes: 1

marcospereira
marcospereira

Reputation: 12214

The way to do it in Play 2.4.x is to use an HttpErrorHandler as documented here:

https://www.playframework.com/documentation/2.4.x/JavaErrorHandling

You can just extends the DefaultHttpErrorHandler and add return your custom pages:

  1. https://www.playframework.com/documentation/2.4.x/JavaErrorHandling#Extending-the-default-error-handler
  2. https://www.playframework.com/documentation/2.4.x/api/java/play/http/DefaultHttpErrorHandler.html

Here is a full example, considering that you are trying to override the default 404 page:

package com.acme.controllers.handlers;

import play.*;
import play.api.OptionalSourceMapper;
import play.api.UsefulException;
import play.api.routing.Router;
import play.http.DefaultHttpErrorHandler;
import play.libs.F.*;
import play.mvc.Http.*;
import play.mvc.*;

import javax.inject.*;

public class ErrorHandler extends DefaultHttpErrorHandler {

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

    @Override
    protected Promise<Result> onNotFound(RequestHeader request, java.lang.String message) {
      Logger.error("onHandlerNotFound!");
      return Promise.pure(Results.internalServerError(views.html.page404.render()));
    }
}

And then, you need to configure in your conf/application.conf like this:

play.http.errorHandler = "com.acme.controllers.handlers.ErrorHandler"

Upvotes: 2

Related Questions