【问题标题】:SparkJava custom error pageSparkJava 自定义错误页面
【发布时间】:2013-11-12 22:09:15
【问题描述】:

有谁知道在使用 Spark 微型网络框架时如何覆盖现有的 404 错误页面?

默认错误页面是:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 404 </title>
</head>
<body>
<h2>HTTP ERROR: 404</h2>
<p>Problem accessing /strangepage. Reason:
<pre>    Not Found</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>

我想编辑这个 custom 错误页面(或者可能将其重定向到另一条路线):

get(new Route("/404") {
   @Override
   public Object handle(Request request, Response response) {
       response.type("text/html");
       return "Error page 404";
   }
});

【问题讨论】:

    标签: spark-java


    【解决方案1】:

    尝试使用下面的提示

    在最后一条路线之后添加这些行,因为 Spark 关心订单

    Spark.get("*", (req, res) -> {    
        if(!req.pathInfo().startsWith("/static")){
            res.status(404);
            return TEMPLATE_ENGINE.render(ModelAndView modelAndView);
        }
        return null;
    });
    

    所有请求(包括静态请求)与将在此处捕获的所有上层路由都不匹配。因此,您必须使用 IF 语句将奇怪的请求和静态请求分开。您应该在此处将错误 html 页面作为字符串返回。

    所有静态请求都由另一个处理程序处理,您必须返回 NULL 以强制 Spark 正常调用另一个处理程序。

    【讨论】:

    • 错误:(214, 35) java: lambda 表达式在 -source 1.6 中不受支持(使用 -source 8 或更高版本来启用 lambda 表达式)
    • 当我将目标更改为 8 时,它返回:Error:java: javacTask: source release 8 requires target release 1.8
    • 我是否必须将所有外部依赖项(例如 Jetty、servlet、freemarker、slf4j、spark-core)重新构建到 1.8 ?
    • 你能告诉我你使用的IDE和构建工具吗?
    【解决方案2】:

    这是一个古老的问题,但仍然有答案。

    现在您可以按如下方式处理 404:

    notFound("<html><body><h1>Custom 404 handling</h1></body></html>");
    

    【讨论】:

    • 谢谢。已经5年了。 Spark 开发人员似乎很难修复这个基本的未实现功能。还有其他未实现的基本 HTTP 规范 Spark 开发人员决定忽略它。
    • 这个方法也接受一个路由,如果你想设置内容类型:notFound((req, res) -&gt; ...)
    【解决方案3】:

    如果您将应用部署在网络服务器上,您可以将错误映射到 spark 路由。

    <filter>
        <filter-name>SparkFilter</filter-name>
        <filter-class>spark.servlet.SparkFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>com.company.YourApplication</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>SparkFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
    <error-page>
        <error-code>404</error-code>
        <location>/404</location> <!-- this is your route-->
    </error-page>
    

    【讨论】:

      【解决方案4】:

      我认为您可以使用 Spark 过滤器。过滤掉不允许的路由。您可以在过滤器中渲染新模板。

      这是来自文档的示例。

      before(new Filter() { // matches all routes
          @Override
          public void handle(Request request, Response response) {
              boolean authenticated;
              // ... check if authenticated
              if (!authenticated) {
                  halt(401, "You are not welcome here");
              }
          }
       });
      

      【讨论】:

      • 问题是“公共目录”。过滤每个 url 路径是不可能的,因为公共目录(它会抛出 Jetty 404 错误页面)。
      【解决方案5】:

      在 Spark 2.3 文档中:

      get("/throwexception", (request, response) -> {
          throw new NotFoundException();
      });
      
      exception(NotFoundException.class, (e, request, response) -> {
          response.status(404);
          response.body("Resource not found");
      });
      

      我发现不是“/throwexception”,而是“/*”获取所有未找到的页面。如果您的 url 结构比我正在做的更复杂,这可能不起作用。我无法在我的项目中解决 NotFoundException,所以我认为您可以自己制作异常或抛出内置异常。

      【讨论】:

        【解决方案6】:

        显然,这是 Spark 很长一段时间都无法解决的问题。但我能够想出一个解决方法: https://github.com/perwendel/spark/issues/197#issuecomment-213952246

        基本上是自己启动和配置嵌入式 Jetty,而不是让 Spark 为您完成。

        【讨论】:

        • 请在您的问题中添加相关代码。如果你碰巧删除了你的github,答案就变得毫无用处了:)
        【解决方案7】:

        对于那些想要处理所有异常并返回错误消息的人来说,这里有一个简单的方法来声明处理程序:

        exception(Exception.class, exceptionHandler());
        

        然后是一个简单的实现:

        private ExceptionHandler exceptionHandler() {
            return (e, req, res) -> {
                res.status(500);
                res.body("<h1>Exception occurred</h1><div>" + e.getMessage() + "</div>");
            };
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-26
          • 2013-08-26
          • 2014-02-28
          • 2016-04-25
          • 2013-02-27
          • 1970-01-01
          • 2013-09-16
          • 2011-03-26
          相关资源
          最近更新 更多