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

问题描述 投票:0回答:1

解决

在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
即可,效果很好。我不知道为什么...

有人可以帮忙吗?

java spring spring-mvc spring-boot
1个回答
0
投票

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

这是我的工作配置:

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

和控制器建议:

@ControllerAdvice
public class ErrorHandlingController { ... }
© www.soinside.com 2019 - 2024. All rights reserved.