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

发生异常时,未调用ResponseEntityExceptionHandler

澹台举
2023-03-14

我是Spring的新手。我正在使用SpringWebMVC开发RESTAPI。对于错误处理,我得到了这个链接http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann rest spring mvc异常

我曾尝试在我的项目中使用ResponseEntityExceptionHandler。但每当我的控制器抛出异常时,它永远不会到达这个ResponseentityException Handler。

以下是我的代码片段

控制器

@Controller
@RequestMapping("/hello")
public class HelloController {  
    private static final Logger logger = Logger.getLogger(HelloController.class);
    @RequestMapping(value="/{name}", method=RequestMethod.GET)
    public @ResponseBody String greet(@PathVariable(value = "name")String name ) throws InvalidInputException, ResourceNotFoundException{
        logger.info("start greet() "+name );
        System.out.println("start greet() "+name);
        String message = null;
        if("".equalsIgnoreCase(name))
        {
            throw new InvalidInputException("Invalid Input");
        }
        List<String> names = new ArrayList<String>();
        names.add("Harshal");
        names.add("Smitesh");
        if(names.contains(name)){
            message = "Hello "+ name;
        }else{
            throw new ResourceNotFoundException("Requested Resource not found");
        }
        System.out.println("end greet");
        logger.info("end greet()");
        return message;
    }
}

异常

package com.practice.errorhandlerdemo.exception;

public class InvalidInputException extends RuntimeException{
    private static final long serialVersionUID = 5489516240608806490L;
    public InvalidInputException() {
        super("Invalid Input");
    }
    public InvalidInputException(String message) {
        super(message);
    }
}

package com.practice.errorhandlerdemo.exception;

public class ResourceNotFoundException extends RuntimeException {
    private static final long serialVersionUID = -4041009155673754859L;
    public ResourceNotFoundException() {
        super("requested resource not found");
    }
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

异常处理程序

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    private static final Logger logger = Logger.getLogger(RestResponseEntityExceptionHandler.class);
    @ExceptionHandler(value={ResourceNotFoundException.class})
    @ResponseStatus(value=HttpStatus.NOT_FOUND)
    protected ResponseEntity<Object> handleResourceNotFound(RuntimeException ex, WebRequest request){
        logger.info("start handleResourceNotFound()");
        String bodyOfResponse = "Requested resource does not found";
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.NOT_FOUND, request);
    }

    @ExceptionHandler(value={InvalidInputException.class})
    @ResponseStatus(value=HttpStatus.BAD_REQUEST)
    protected ResponseEntity<Object> handleInvalidInput(RuntimeException ex, WebRequest request){
        logger.info("start handleInvalidInput()");
        String bodyOfResponse = "Invalid Input";
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.BAD_REQUEST, request);
    }
}

调度器servlet

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd">

   <context:component-scan base-package="com.practice.errorhandlerdemo.controller"/>
   <context:annotation-config/>  

</beans>

网.xml

<web-app>
    <display-name>ErrorHandlerDemo</display-name>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/my-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

共有3个答案

丰博
2023-03-14

问题是你的@ExceptionHandler声明 ResourceNotFoundException,而作为 handleResourceNotFound 的参数,你期望 RuntimeException。参数 exception 和 ExceptionHandler 的值应该匹配。

所以应该是:

@ExceptionHandler(value={ResourceNotFoundException.class})
protected ResponseEntity<Object> handleResourceNotFound(ResourceNotFoundException ex, WebRequest request){
    
}
蒙才
2023-03-14

我在Spring WebMVC 4.2.5中也遇到了同样的问题。原因是< code>DispatcherServlet的< code > throwExceptionIfNoHandlerFound 参数。默认情况下,它的值为< code>false,因此所有错误都会生成< code>HttpServletResponse。SC_NOT_FOUND servlet响应,没有抛出异常。

设置为true后,我的@ExceptionHandler开始工作

薛弘阔
2023-03-14

首先,检查您的配置是否考虑了您的@ControlllerAdvie注释类:它是否位于Spring扫描的包中?您是否以任何其他方式将其声明为bean?

此外,如果不需要它提供的所有异常映射,也不需要扩展< code > ResponseEntityExceptionHandler 。

编写异常处理的更简单方法:

@ControllerAdvice
public class RestResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    protected ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex){

      return ResponseEntity
              .status(HttpStatus.NOT_FOUND)
              .body("Requested resource does not found");
    }

    @ExceptionHandler(InvalidInputException.class)
    protected ResponseEntity<String> handleInvalidInput(InvalidInputException ex){

      return ResponseEntity
              .badRequest()
              .body("Invalid Input");
    }
}

请注意,响应实体构建器 API 已在 Spring 4.1 中引入,但您可以在 4.0.x 上使用常规构造函数。

 类似资料:
  • 问题内容: 我有在Android上运行良好的代码。当我将其移植到具有JRE 1.6的Windows 64位计算机上时,该代码不起作用。 当我运行以下代码行时: 我得到以下异常: java.security.NoSuchAlgorithmException:SHA256 MessageDigest在java.security.MessageDigest.getInstance(未知源)处的java.

  • 假设我有以下代码行, 我的代码为: 现在发生的情况是,当编译器到达}catch(final SQLException se){时,它没有转到它的catch主体,只是脱离了,不知道为什么吗?

  • 我通过Spring Boot中编写的侦听器使用JMS对象消息。我正在通过我的Camel应用程序将ObjectMessage发送到ActiveMQ队列,我正在Spring Boot应用程序中的侦听器类中侦听队列。 代码: 这是我的POJO类: 在ActiveMQ队列中,我收到的消息为: 我在Spring Boot中的JMS侦听器: 我得到一个Exception@line: 通过堆栈溢出和网络上的其他

  • 这个想法是,当用户触摸按钮/图像时,它应该会播放一个声音。 我正在使用android studio创建应用程序。我已经导入了一个名为Audioplayers的包来帮助播放音频。 当我运行代码时,应用程序已经构建并显示图像,但当我点击图像时,它给我一个无法解决的错误:

  • 我有一个问题与OneTo多关系。我正在使用sping-mvc和sping-Security和Hibernate4。 我正在为所有人使用注释。 我的问题是在实体战争中,当我看到属性列表玩家调试时,我看到,当我单击它时, 我也得到了这个例外: 实体: - 我的DAO

  • 同时调用cTAKES解析器从tika-app得到以下: 例外 异常java的屏幕截图。lang.NoSuchMethodError 线程“main”java中出现异常。lang.NoSuchMethodError:opennlp。工具。sentdetect。句子模型。getMaxentModel()Lopennlp/model/AbstractModel; 我遵循了本链接中提到的步骤。我无法理解这