Play2:是否可以响应405方法不允许“代替”404 Not Found“如果路径存在,但不适用于当前方法

时间:2015-05-13 09:33:57

标签: playframework

当我把这样的东西放到我的路线文件中时:

GET /foo com.example.controllers.FooController.foo

然后向此资源发出请求GET,例如POST /foo,默认路由器响应404并且“未找到操作”。是否有可能让它检测到不同方法的资源存在并输出状态代码405(不允许方法)?

2 个答案:

答案 0 :(得分:1)

您需要覆盖onHandlerNotFound类中的GlobalSettings方法:

  

未找到任何操作来处理请求时调用。默认行为是呈现框架的默认404页面。这是通过返回null来实现的,以便Scala引擎处理onHandlerNotFound。通过重写此方法,可以提供另一个404页面。

更多详情here

答案 1 :(得分:0)

只需在您的APP文件夹中添加Class Global并在onHandlerNotFound上覆盖方法,如下所示:

import play.*;
import play.mvc.*;
import play.mvc.Http.*;
import play.libs.F.*;

import static play.mvc.Results.*;

public class Global extends GlobalSettings {

    public Promise<Result> onHandlerNotFound(RequestHeader request) {
        return Promise.<Result>pure(
                status(405, "Method Not Allowed")
        );
    }

}

播放framewrok没有结果不允许你必须使用状态https://www.playframework.com/documentation/2.3.x/api/java/index.html

我认为你应该写一点DSL或自定义路线,看一下方法和路径你是否有一个与动作合成有关的动作在博客文章中是一个很好的解释:

scala中的代码

override def onRouteRequest(req: RequestHeader): Option[Handler] = {
  (req.method, req.path) match {
    case ("GET", "/") => Some(controllers.Application.index)
    case ("POST", "/submit") => Some(controllers.Application.submit)
    case _ => None
  }
}

here是博客条目。