解决
在rest api应用中,异常处理方法的返回类型应该是
ResponseEntity
或者用@ResponseBody
注释该方法,以便Spring Boot可以进行http序列化。
更新
初级班:
@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
@EnableConfigurationProperties
@EnableTransactionManagement//TODO remove this line if not needed
public class Application extends SpringBootServletInitializer{
private static Class<Application> applicationClass= Application.class;
public static void main(String[] args) {
SpringApplication.run(applicationClass, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(applicationClass);
}
}
我正在使用
@ControllerAdvice
来处理 Spring Boot Starter Web 中的全局异常处理,但我遇到了一个奇怪的问题。
当我遵循 spring 官方文档的指南时,https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc,要全局处理异常,只需添加一个处理程序类
@ControllerAdivce
已注释。但是,当我测试它时,当抛出 RunTimeException
时,不会调用异常处理方法。
这是我的代码:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(value = RuntimeException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public RestEntity handleException(HttpServletRequest req, RuntimeException ex) {
RestEntity restEntity=new RestEntity();
Message message=new Message();
message.setCode(1000);
message.setMessage("Something wrong with the server");
restEntity.setMessage(message);
return restEntity;
}
}
并且我在其他控制器中使用
@ExceptionHandler
注释的方法来处理每个控制器中的特定异常,同时将未解决的异常留给 GlobalDefaultExceptionHandler
。
事实证明,这不起作用。我在这里错过了什么吗??
而且,目前,作为一种解决方法,我只需在
@RestControoler
上添加 GlobalDefaultExceptionHandler
即可,效果很好。我不知道为什么...
有人可以帮忙吗?
我实际上必须从我的主应用程序文件中删除@EnableWebMvc。
这是我的工作配置:
@SpringBootApplication
@ComponentScan(basePackages = {
....
})
public class Application extends SpringBootServletInitializer { ... }
和控制器建议:
@ControllerAdvice
public class ErrorHandlingController { ... }