Search code examples
playframework-2.2

Global and response as Json?


I'm adding my specific response to 404/500 errors returned by my Play!Framework application, and in some case, I'd like it to return a Json like answer (as text, it doesn't matter).

I tried this :

import play.GlobalSettings;
import play.libs.F.Promise;
import play.libs.Json;
import play.mvc.Http.RequestHeader;
import play.mvc.SimpleResult;

import com.fasterxml.jackson.databind.node.ObjectNode;
public class Global extends GlobalSettings {
    @Override
    public Promise<SimpleResult> onError(RequestHeader request, Throwable t) {
        if (play.Play.isDev()) {
            return super.onError(request, t);
        }

        if ("/api/".equals(request.path().substring(0, 5))) {
            ObjectNode result = Json.newObject();
            result.put("error", "Internal server error.");
            result.put("code", "500");

            return Promise.<SimpleResult>pure(internalServerError(result));
        }
        else {
            return Promise.<SimpleResult>pure(internalServerError(
                views.html.internalServerError.render()
            ));
        }
    }

    @Override
    public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
        if (play.Play.isDev()) {
            return super.onHandlerNotFound(request);
        }

        if ("/api/".equals(request.path().substring(0, 5))) {
            ObjectNode result = Json.newObject();
            result.put("error", "Url not found.");
            result.put("code", "404");

            return Promise.<SimpleResult>pure(internalServerError(result));
        }
        else {
            return Promise.<SimpleResult>pure(notFound(
                views.html.notFound.render()
            ));
        }
    }
}

But I got a error: cannot find symbol located at the line with internalServerError.

I believe internalServerError expect a rendered template, but how can I instead specify a Json object (or at least a string) ?


Solution

  • Importing Results and calling Results.internalServerError(result) and so on should get rid of the compilation error.

    import play.mvc.Results;
    
    ...
    return F.Promise.<SimpleResult>pure(Results.internalServerError(result));