spring boot starter web @ControllerAdvice注释在没有@RestController注释的情况下无效

时间:2015-05-22 04:03:18

标签: java spring spring-mvc spring-boot

RESOLVE

在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中的全局异常处理,我遇到了一个奇怪的问题。

当我按照春季官方文档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注释的方法来处理每个Controller中的特定异常,同时为GlobalDefaultExceptionHandler留下未解决的异常。

事实证明它不起作用。我在这里错过了什么吗?

目前,作为一种解决方法,我只需在@RestControoler上添加GlobalDefaultExceptionHandler,它就可以了。我不知道为什么......

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:0)

我实际上必须从主应用程序文件中删除@EnableWebMvc。

这是我的工作配置:

@SpringBootApplication
@ComponentScan(basePackages = {
....
})
public class Application extends SpringBootServletInitializer { ... }

和ControllerAdvice:

@ControllerAdvice
public class ErrorHandlingController { ... }