当前位置: 首页 > 知识库问答 >
问题:

ResponseBody方法和normal方法的多个异常处理程序

仉俊能
2023-03-14

我有一个要求,我想在那里处理异常是如何返回的。根据controller方法的类型,如果它是用@ResponseBody注释的,则应该返回一个json字符串。另外,如果它是一个返回字符串的方法,则应该返回一个jsp错误页面。

但是,我似乎无法定义两个全局异常处理程序(带有ControllerAdvice),这两个程序都处理exception.Class,但一个返回ModelAndView,另一个用@ResponseBody注释。我得到一个例外,提到它太含糊了。

org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:为[class java.lang.exception]映射的@ExceptionHandler方法不明确

下面的代码是一个理想情况的示例,这两种情况都可以处理

方法

@RequestMapping(value = "/{pathValue}/page", method = RequestMethod.GET)
public String getPage(@PathVariable(value="pathValue") String pathValue, ModelMap model) throws Exception {

@RequestMapping(value = "{pathValue}/jsonData", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ModelMap getJson(@PathVariable(value="pathValue") String pathValue) throws Exception { 
@ExceptionHandler(Exception.class)
@ResponseBody ErrorInfo handleBadRequest(HttpServletRequest req, Exception ex) {

@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { 

在上面的示例中,getPage方法应该由handleBadRequest处理,getJson应该由defaultErrorHandler处理

有没有办法配置两个全局异常处理程序,它们都处理同一个异常类,并基于Controller方法类型返回一个页面或json。

共有1个答案

严宸
2023-03-14

我想不是现成的,因为AbstractHandlerMethodExceptionResolver无法完成您想要的任务。如果我没有弄错的话,那么接口没有任何参数可以指示抛出异常的特定实例的方法。

我记得创建包装实现(例如aspect),它可以用特定的异常类型进行配置,这在过去帮助了我。这样的实现将包装每个控制器方法的调用并捕获所有异常,只是为了将其包装为可配置的异常类型并重新抛出。在您的例子中,它类似于JsonSomethingException和ResourceSomethingException。

另一种选择可能是相反的(更低级别的)方法。注意,在异常处理方法中,您接收到HttpServletRequest实例,因此可以浏览有关请求的一些数据。在您的情况下,@RequestMapping基于这个数据来确定应该调用哪个方法-您可以在异常处理程序中执行同样的操作!最好的(imho)方法是通过HTTP协议的内容类型头来区分json和html。在这种情况下,编写一个全局错误处理程序(它根据内容类型返回适当的ResponseEntity)将非常容易。特别是添加了一些json解析器(例如Jackson)。

祝你好运:)。

 类似资料:
  • 本文向大家介绍C#异常处理的技巧和方法,包括了C#异常处理的技巧和方法的使用技巧和注意事项,需要的朋友参考一下 c#中或多或少回出现一些意向不道的异常,那么如何去捕获这个异常就非常的关键--这个异常可能是系统的不可控因素也有可能是程序本身才一个异常。下面就具体的解决方案提供给大家,希望有所帮助 从最常见的分母为0的情况的实例 通过try catch finally三个关键字的一个语法结构图。fin

  • 我有以下控制器类 } 对于异常处理,我使用Spring3。2.建议如下: } 我将XML bean定义为 控制器通知处理程序不处理从控制器引发的异常。我在谷歌上搜索了几个小时,但找不到它发生的原因。我照着描述的做了http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/在这里 如果有人知道,请告诉

  • 我正在为Spring MVC中的异常处理开发示例演示应用程序。我正在尝试使用@ControllerAdvice处理异常 我遵循了本链接中描述的步骤。 但是当我运行我的应用程序时,我得到了以下错误 以下是我正在学习的课程 应用程序异常。JAVA 控制器类 ApplicationExceptionController。JAVA 下面是GlobalExceptionHandler类 GlobalExce

  • 我是Spring Boot的新手。在一个项目中,我想异步发送一封电子邮件。下面,你可以看到我到目前为止有什么。 我遇到的一个问题是:外部系统向控制器发送POST请求。如果在生成或发送邮件时发生异常,则不会调用。因此,控制器总是返回HTTP 201,因此调用者认为一切正常。 我将如何集成我的异常处理程序与在这样的异步方法? 控制器 服务 异常处理程序

  • 我想处理验证器引发的异常。 我用ControllerAdvice注释创建了异常处理程序。它处理其他异常,但不处理MethodArgumentNotValidException。 异常处理程序 已验证的类(没有getter/setter等) Rest api控制器 Api异常(没有getter/setter等) 目前,我从验证器获得了一个空响应,带有错误的\u请求http状态,而其他异常得到了正确处

  • 本文向大家介绍处理Python中的URLError异常的方法,包括了处理Python中的URLError异常的方法的使用技巧和注意事项,需要的朋友参考一下 1.URLError 首先解释下URLError可能产生的原因:     网络无连接,即本机无法上网     连接不到特定的服务器     服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常。下面是一个例子,先感受