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) ?
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));