![](/img/trans.png)
[英]@ExceptionHandler for type Exception not called for Spring exception in custom ResponseEntityExceptionHandler
[英]ResponseEntityExceptionHandler is not getting called when exception occurs
我是 spring 的新手。 我正在使用 spring webmvc 开发 REST api。 对于错误处理,我得到了这个链接http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptions
我曾尝试在我的项目中使用 ResponseEntityExceptionHandler。 但每当我的 controller 抛出异常时,它永远不会到达这个 ResponseEntityExceptionHandler。
以下是我的代码片段
Controller
@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>
web.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>
首先,检查您的配置是否考虑了您的@ControllerAdvice
注释类:它是否位于 Spring 扫描的包中? 您是否以其他方式将其声明为 bean?
此外,如果您不需要它提供的所有异常映射,则不需要扩展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");
}
}
请注意, ResponseEntity
builder API 已在 Spring 4.1 中引入,但您可以在 4.0.x 上使用常规构造函数。
我在 Spring WebMVC 4.2.5 中遇到了同样的问题。 原因是DispatcherServlet
的throwExceptionIfNoHandlerFound
参数。 默认情况下,它的值为false
,因此所有错误都会生成HttpServletResponse.SC_NOT_FOUND
servlet 响应,并且不会抛出异常。
将其设置为 true 后,我的@ExceptionHandlers
开始工作
问题是您的@ExceptionHandler 声明了ResourceNotFoundException,而作为handleResourceNotFound 的参数,您期望RuntimeException。 参数 exception 和 ExceptionHandler 的值应该匹配。
所以应该是:
@ExceptionHandler(value={ResourceNotFoundException.class})
protected ResponseEntity<Object> handleResourceNotFound(ResourceNotFoundException ex, WebRequest request){
}
一些解决方法,
ResponseEntityExceptionHandler
。ResponseEntityExceptionHandler::handleException
方法中放置一个断点。NoHandlerFoundException
,您应该将 DispatcherServlet 配置为在找不到任何处理程序时抛出异常,请在此处链接。有一些报告的情况是ResponseEntityExceptionHandler
和@ControllerAdvice
都不起作用。
他们都应该将类下带有@ExceptionHandler
注解的方法编译到所有控制器都可以引用的公共位置。
如果它不适合你。 您可以将@ExceptionHandler
方法添加到由所有其他控制器扩展的通用AbstractController
类中。
你只需要一些配置
在 application.properties 或 application.yml 中:
server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
在 springboot 上加载您的配置文件:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "xx.xxx.xxxx")
@PropertySource("classpath:application.yml")
public class WebAppConfig {
}
提供一个@ExceptionHandler
方法来处理内部 Spring MVC 异常。 此方法返回一个ResponseEntity
用于使用消息转换器写入响应,而DefaultHandlerExceptionResolver
返回一个ModelAndView
。
改进@Javasick 对我有用的答案。
如何将ThrowExceptionIfNoHandlerFound 设置为true。
public class AppSetting extends AbstractAnnotationConfigDispatcherServletInitializer {
@NonNull
@Override
protected DispatcherServlet createDispatcherServlet(@NonNull WebApplicationContext servletAppContext) {
final DispatcherServlet servlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
servlet.setThrowExceptionIfNoHandlerFound(true);
return servlet;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.