Add generic error page with stack trace
Add a @ControllerAdvice that catches all exceptions and renders an error page showing status, error type, message, and full stack trace in a <pre> block. Uses table-based layout consistent with the rest of the UI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
package be.seeseepuff.webgit.controller;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class ErrorController
|
||||||
|
{
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public ModelAndView handleException(HttpServletRequest request, Exception ex)
|
||||||
|
{
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
ex.printStackTrace(new PrintWriter(sw));
|
||||||
|
|
||||||
|
ModelAndView mav = new ModelAndView("error");
|
||||||
|
mav.addObject("status", HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||||
|
mav.addObject("error", HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
|
||||||
|
mav.addObject("message", ex.getMessage());
|
||||||
|
mav.addObject("trace", sw.toString());
|
||||||
|
mav.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
return mav;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/main/resources/templates/error.html
Normal file
27
src/main/resources/templates/error.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Error</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Error</h1>
|
||||||
|
<table border="1" cellpadding="4" cellspacing="0">
|
||||||
|
<tr>
|
||||||
|
<td><b>Status</b></td>
|
||||||
|
<td th:text="${status}">500</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Error</b></td>
|
||||||
|
<td th:text="${error}">Internal Server Error</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Message</b></td>
|
||||||
|
<td th:text="${message}">Something went wrong</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h2>Stack Trace</h2>
|
||||||
|
<pre th:text="${trace}">No stack trace available.</pre>
|
||||||
|
<br/>
|
||||||
|
<a href="/" target="_top">Back to home</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package be.seeseepuff.webgit.controller;
|
||||||
|
|
||||||
|
import be.seeseepuff.webgit.service.GitService;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
|
||||||
|
import org.springframework.test.context.bean.override.mockito.MockitoBean;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.doThrow;
|
||||||
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||||
|
|
||||||
|
@WebMvcTest
|
||||||
|
class ErrorPageTest
|
||||||
|
{
|
||||||
|
@Autowired
|
||||||
|
private MockMvc mockMvc;
|
||||||
|
|
||||||
|
@MockitoBean
|
||||||
|
private GitService gitService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void errorPageShowsStackTrace() throws Exception
|
||||||
|
{
|
||||||
|
doThrow(new RuntimeException("Something broke")).when(gitService).push("badrepo");
|
||||||
|
|
||||||
|
mockMvc.perform(post("/repo/badrepo/push"))
|
||||||
|
.andExpect(status().is5xxServerError())
|
||||||
|
.andExpect(content().string(org.hamcrest.Matchers.containsString("Error")))
|
||||||
|
.andExpect(content().string(org.hamcrest.Matchers.containsString("Stack Trace")));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user