Spring 启动 404:未捕获控制器建议中未发现处理程序异常
Spring Boot 404 : no handler found exception in Controller Advice isn't catched
因此,当用户尝试调用我的应用程序未知的 url 时,我尝试发送自定义答案。为此,我首先添加到我的 application.properties(在主文件夹和测试文件夹中)
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
因此,如果未找到处理程序,则会抛出异常。此异常应为 NoHandlerFoundException
类型
然后我在我的控制器建议中添加了一个自定义异常处理程序
我的控制器建议(简化)
@EnableWebMvc // (I tried with and without it doesn't change the error)
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE) // (I tried with and without it doesn't change the error)
public class ExceptionsHandler extends ResponseEntityExceptionHandler {
// invalid route handler
@Override
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
protected ResponseEntity<Object> handleNoHandlerFoundException(
NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
String error = "No handler found for " + ex.getHttpMethod() + " " + ex.getRequestURL();
ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ex.getLocalizedMessage(), error);
return new ResponseEntity<>(apiError.getErrors(), new HttpHeaders(), apiError.getStatus());
}
}
使用这个,在我的测试中调用未知 url 时使用:
this.mvc.perform(get("/ttt"))
.andDo(print())
.andExpect(status().isNotFound())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.error").value("No Handler found for GET /ttt"));
我进入调试控制台:
o.s.web.servlet.PageNotFound : No mapping for GET /ttt
虽然,答案没有我的自定义错误消息,因为我也进入了我的调试控制台:
MockHttpServletResponse:
Status = 404
Error message = null
Headers = []
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
然后我试了
@ExceptionHandler({NoHandlerFoundException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public ResponseEntity<Object> handleNoHandler(HttpServletRequest request, Exception ex) {
String error = ex.getMessage();
return new ResponseEntity<>(error, new HttpHeaders(), HttpStatus.NOT_FOUND);
}
但随后 非法状态异常:无法加载应用程序上下文 被抛出
IllegalStateException:Ambiguous @ExceptionHandler method mapped for [class org.framework.web.servlet.NoHandlerFoundException]
ALso,当我在我的处理程序中放置断点并调试我的测试时,执行永远不会在任何断点处停止。
所以看起来 MockMvc 在使用异常处理程序时构建 MockHttpServletRequest 时遇到了问题,因此内容为空。
当我 运行 我的 springboot 应用程序并尝试在我的导航器中调用一个未知的 url 时, 它有效 。我使用 覆盖方法 .
得到了预期的 error 404; with body : No handler found
在此处查看更多内容,将已接受的答案与实用性分数叠加在一起 ->
因此,当用户尝试调用我的应用程序未知的 url 时,我尝试发送自定义答案。为此,我首先添加到我的 application.properties(在主文件夹和测试文件夹中)
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
因此,如果未找到处理程序,则会抛出异常。此异常应为 NoHandlerFoundException
类型然后我在我的控制器建议中添加了一个自定义异常处理程序 我的控制器建议(简化)
@EnableWebMvc // (I tried with and without it doesn't change the error)
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE) // (I tried with and without it doesn't change the error)
public class ExceptionsHandler extends ResponseEntityExceptionHandler {
// invalid route handler
@Override
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
protected ResponseEntity<Object> handleNoHandlerFoundException(
NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
String error = "No handler found for " + ex.getHttpMethod() + " " + ex.getRequestURL();
ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ex.getLocalizedMessage(), error);
return new ResponseEntity<>(apiError.getErrors(), new HttpHeaders(), apiError.getStatus());
}
}
使用这个,在我的测试中调用未知 url 时使用:
this.mvc.perform(get("/ttt"))
.andDo(print())
.andExpect(status().isNotFound())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.error").value("No Handler found for GET /ttt"));
我进入调试控制台:
o.s.web.servlet.PageNotFound : No mapping for GET /ttt
虽然,答案没有我的自定义错误消息,因为我也进入了我的调试控制台:
MockHttpServletResponse:
Status = 404
Error message = null
Headers = []
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
然后我试了
@ExceptionHandler({NoHandlerFoundException.class})
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public ResponseEntity<Object> handleNoHandler(HttpServletRequest request, Exception ex) {
String error = ex.getMessage();
return new ResponseEntity<>(error, new HttpHeaders(), HttpStatus.NOT_FOUND);
}
但随后 非法状态异常:无法加载应用程序上下文 被抛出
IllegalStateException:Ambiguous @ExceptionHandler method mapped for [class org.framework.web.servlet.NoHandlerFoundException]
ALso,当我在我的处理程序中放置断点并调试我的测试时,执行永远不会在任何断点处停止。
所以看起来 MockMvc 在使用异常处理程序时构建 MockHttpServletRequest 时遇到了问题,因此内容为空。 当我 运行 我的 springboot 应用程序并尝试在我的导航器中调用一个未知的 url 时, 它有效 。我使用 覆盖方法 .
得到了预期的error 404; with body : No handler found
在此处查看更多内容,将已接受的答案与实用性分数叠加在一起 ->