当使用@ControllerAdvice
和@ExceptionHandler
注解沿着一些处理程序方法时,我能够捕获自己和Sping Boot 内部抛出的异常事件。为了让处理程序知道要捕获哪个异常事件,我可以在处理程序中使用特定的嵌套Exception类作为通用Exception类,作为参数......它将捕获相应的事件。
我还没有设法捕获一个特定的Exception事件,其中用户从@RestController中不存在的REST端点或路径请求资源......一个“坏路径”。它只是返回一个404 NOT FOUND响应负载作为JSON,但是我无法在@ControllerAdvice
@ExceptionHandler方法中捕获它,从而更改特定异常事件的响应。level Exception.class我可以捕获这个事件吗...我也不知道Sping Boot 在抛出这个特定事件时使用的特定嵌套Exception类。
有谁知道当用户请求到应用程序的@RestController
的“坏路径”(不存在的端点)时,Sping Boot 示例抛出的Exception类类型是什么?
3条答案
按热度按时间jv4diomz1#
我设法在过去的一个项目中使用两个配置添加了一个自定义的无效路由异常,不确定它是否与Spring 3.x相关:
这些属性和对应的NoHandlerFoundException的ExceptionHandler允许我为未Map的路由添加自己的自定义响应处理程序。
nbnkbykc2#
回答您的问题:NoHandlerFoundException
您的答案驻留在“ResponseEntityExceptionHandler.class”中,它负责处理通过Spring Web Framework引发的每个可能的Web异常,并将其转换为HTTP Response。
您会发现一个标记有@ExceptionHandler的通用保持器方法来处理所有此类异常,并且所有异常类都将独占地Map到注解@ExceptionHandler中的该方法。
dluptydi3#
最后,我成功地为这个用例的特殊流程调整了2个解决方案!!:D
**解决方案1:**通过创建一个ErrorController并实现一个/error servletMap路径的方法。在内部,您可以创建并返回您的ResponseEntity,或者,在我的例子中,我选择抛出我的自定义PathNotFoundException的示例,以便稍后我可以在我的@AdviceController @ExceptionHandler方法中捕获它的事件并在那里挂载我的响应有效负载数据。这种解决方案的缺点是,您无法从HttpServletRequest中获得用户试图访问的路径,因为可用的路径将是ErrorController中的中间“/error”路径,而不是用户试图从中获取任何资源的原始路径。但是,至少,使用这种解决方案,您可以捕获异常事件(在ErrorController中)并将流量定向到您的自定义处理程序,以创建并返回自定义ResponseEntity和有效负载数据。
。
。
。
**解决方案2:**这是最好的解决方案。为了避免重定向到ErrorController和从ErrorController重定向,并且不必在那里实现自定义/error方法,您可以简单地:
2.1:在www.example.com添加这两个 prop application.properties:
2.2:在@AdviceController @ExceptionHandler方法中,您将能够捕获NoHandlerFoundException事件,就像在那里捕获任何其他异常事件一样,然后挂载ResponseEntity和有效负载数据。最重要的是,由于不会有往返于ErrorController(/error)的重定向,因此您将能够从HttpServletRequest获得用户试图访问的原始路径。
感谢所有帮助解决这个简单但反复出现的问题的人,这样其他人就可以从中学习,而不是像我一样浪费24小时寻找解决方案;D级
再见。
丹尼尔·平埃罗
danielpm1982.com