2013-11-01 3 views
5

Кто-нибудь знает как переопределить существующую страницу ошибки 404 при использовании Spark micro web framework?Исходная страница ошибки SparkJava

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

<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"; 
    } 
}); 

ответ

2

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

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

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

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

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"); 
     } 
    } 
}); 
+0

проблема «общий каталог». Невозможно фильтровать каждый URL-адрес, потому что public dir (который выдает страницу ошибки Jetty 404). – dns

3

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

Добавьте эти строки сразу после последнего маршрута, потому что Спарк заботится о порядке

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

Все запрос (включая статический запрос) не соответствуют всем верхним маршрутам который будет улавливать здесь. Таким образом, вам нужно отделить странные запросы и статический запрос с инструкцией IF. Здесь вы должны вернуть свою страницу html ошибки как строку.

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

+0

Ошибка: (214, 35) java: выражения lambda не поддерживаются в источнике 1.6 (используйте для включения лямбда-выражения значение -8 или выше) – dns

+0

Когда я меняю цель на 8, она возвращает: Ошибка: java: javacTask: исходный выпуск 8 требует целевого релиза 1.8 – dns

+0

Должен ли я перестроить всю внешнюю зависимость (например, Jetty, сервлет, freemarker, slf4j, искровое ядро) до 1,8? – dns

1

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

0

Видимо, это проблема, с которой Спарк не смог обратиться довольно долго. Но я смог придумать работу: https://github.com/perwendel/spark/issues/197#issuecomment-213952246

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

1

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

exception(Exception.class, exceptionHandler()); 

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

private ExceptionHandler exceptionHandler() { 
    return (e, req, res) -> { 
     res.status(500); 
     res.body("<h1>Exception occurred</h1><div>" + e.getMessage() + "</div>"); 
    }; 
} 
Смежные вопросы