2013-11-01 13 views
5

Có ai biết cách ghi đè trang lỗi 404 hiện tại khi sử dụng Spark khung web vi mô không?Trang lỗi tùy chỉnh SparkJava

Trang lỗi mặc định là:

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

Tôi muốn chỉnh sửa tùy chỉnh trang lỗi này (hoặc có thể chuyển hướng nó vào một con đường khác):

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

Trả lời

2

nếu bạn triển khai ứng dụng của bạn trên máy chủ web, bạn có thể ánh xạ lỗi tới tuyến đường phát tia lửa.

<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

Tôi nghĩ bạn có thể sử dụng Bộ lọc tia lửa. Để lọc ra các tuyến đường không được phép. Bạn có thể hiển thị mẫu mới trong bộ lọc.

Đây là ví dụ từ tài liệu.

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

vấn đề là 'thư mục công cộng'. Không thể lọc mọi đường dẫn url vì thư mục công cộng (mà ném trang lỗi Jetty 404). – dns

3

Cố gắng sử dụng mẹo này dưới

Thêm những dòng này ngay sau khi tuyến đường qua vì Spark quan tâm đến trật tự

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

Tất cả các yêu cầu (bao gồm yêu cầu tĩnh) không khớp với tất cả các tuyến trên sẽ được bắt ở đây. Vì vậy, bạn phải tách các yêu cầu lạ và yêu cầu tĩnh với câu lệnh IF. Bạn nên trả lại trang html lỗi của bạn dưới dạng chuỗi ở đây.

Tất cả yêu cầu tĩnh được xử lý bởi trình xử lý khác và bạn phải trả về NULL để buộc Spark gọi trình xử lý khác như trường hợp thông thường.

+0

Lỗi: (214, 35) java: biểu thức lambda không được hỗ trợ trong nguồn 1.6 (sử dụng nguồn 8 hoặc cao hơn để bật biểu thức lambda) – dns

+0

Khi tôi thay đổi mục tiêu thành 8, nó trả về: Lỗi: java: javacTask: nguồn phát hành 8 yêu cầu phát hành mục tiêu 1.8 – dns

+0

Tôi có phải xây dựng lại tất cả phụ thuộc bên ngoài (chẳng hạn như Jetty, servlet, freemarker, slf4j, spark-core) đến 1.8? – dns

1

Trong Spark tài liệu 2.3:

get("/throwexception", (request, response) -> { 
    throw new NotFoundException(); 
}); 

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

Tôi đã phát hiện ra rằng thay vì "/ throwexception", "/ *" được tất cả không tìm thấy trang. Điều này có thể không hoạt động nếu bạn có cấu trúc url phức tạp hơn những gì tôi đang làm. Tôi đã không thể giải quyết NotFoundException trong dự án của tôi vì vậy tôi nghĩ rằng bạn có thể làm cho ngoại lệ của riêng bạn hoặc ném một được xây dựng trong một.

1

Đối với những người muốn để xử lý tất cả các trường hợp ngoại lệ và hiển thị lại các thông báo lỗi, đây là một cách đơn giản để khai báo xử lý:

exception(Exception.class, exceptionHandler()); 

và sau đó một thực hiện đơn giản:

private ExceptionHandler exceptionHandler() { 
    return (e, req, res) -> { 
     res.status(500); 
     res.body("<h1>Exception occurred</h1><div>" + e.getMessage() + "</div>"); 
    }; 
} 
Các vấn đề liên quan