Пользовательская страница ошибок SparkJava

Кто-нибудь знает, как переопределить существующую страницу ошибки 404 при использовании микровеб-фреймворка Spark?

Страница ошибки по умолчанию:

<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>

Я хочу отредактировать эту пользовательскую страницу ошибки (или, возможно, перенаправить ее на другой маршрут):

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

person dns    schedule 01.11.2013    source источник


Ответы (7)


Это старый вопрос, но так как на него все еще есть ответ.

Теперь вы можете обработать 404 следующим образом:

notFound("<html><body><h1>Custom 404 handling</h1></body></html>");
person abhinav pandey    schedule 13.04.2018
comment
Спасибо. Прошло 5 лет. Разработчик Spark, похоже, очень медленно исправляет эту базовую нереализованную функцию. Есть и другая нереализованная базовая спецификация HTTP, которую разработчики Spark решили игнорировать. - person dns; 14.04.2018
comment
Этот метод также принимает маршрут, если вы хотите установить тип контента: notFound((req, res) -> ...) - person z0r; 06.09.2019

Попробуйте использовать этот совет ниже

Добавьте эти строки сразу после последнего маршрута, потому что 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 вызвать другой обработчик, как обычно.

person Ken Block    schedule 16.10.2015
comment
Ошибка: (214, 35) java: лямбда-выражения не поддерживаются в -source 1.6 (используйте -source 8 или выше, чтобы включить лямбда-выражения) - person dns; 25.10.2015
comment
Когда я меняю цель на 8, она возвращает: Ошибка: java: javacTask: исходный выпуск 8 требует целевой версии 1.8 - person dns; 25.10.2015
comment
Должен ли я перестроить все внешние зависимости (такие как Jetty, servlet, freemarker, slf4j, spark-core) до версии 1.8? - person dns; 25.10.2015
comment
Можете ли вы сказать мне свою IDE и инструмент сборки, который вы использовали? - person Ken Block; 26.10.2015

если вы развернете свое приложение на веб-сервере, вы можете сопоставить ошибку с искровым маршрутом.

<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>
person janickr    schedule 14.12.2013

Я думаю, вы можете использовать искровой фильтр. Чтобы отфильтровать маршруты, которые не разрешены. Вы можете отобразить новый шаблон в фильтре.

Это пример из документации.

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");
        }
    }
 });
person Shekhar    schedule 05.04.2014
comment
проблема в "общем каталоге". Невозможно отфильтровать каждый URL-адрес, потому что общедоступный каталог (который выдает страницу ошибки Jetty 404). - person dns; 07.04.2014

В документации 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 в моем проекте, поэтому я думаю, что вы можете сделать свое собственное исключение или создать встроенное.

person Sarah Whelan    schedule 28.10.2015

По-видимому, это проблема, которую Spark уже давно не может решить. Но мне удалось найти обходной путь: https://github.com/perwendel/spark/issues/197#issuecomment-213952246

По сути, запускайте и настраивайте встроенный Jetty самостоятельно, вместо того, чтобы Spark делал это за вас.

person user6247490    schedule 24.04.2016
comment
Пожалуйста, добавьте соответствующий код в свой вопрос. Если вам случится удалить свой гитхаб, ответ станет бесполезным :) - person Alfabravo; 13.04.2018

Для тех, кто хочет обрабатывать все исключения и отображать сообщение об ошибке, вот простой способ объявить обработчик:

exception(Exception.class, exceptionHandler());

а затем простая реализация:

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