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

Spring@ControllerAdvice/@ExceptionHandler不工作

江建明
2023-03-14

我的Spring Boot服务将执行一项工作,并在成功后退出0(没有restcontroller),但我也希望它在每个异常时退出,因此我在类上添加了@ControllerAdvice并放置了以下方法:

@ControllerAdvice
@RequiredArgsConstructor
@Slf4j
public class ImportInekData {

final InekService inekService;

final ImportDataService dataService;

public void doTheJob(){
    log.info("Fetching new list from Inek.");
    UpdatedList updatedList = inekService.getUpdatedList();
    List<Standort> toBeUpdated = updatedList.getToBeUpdated();
    List<String> toBeDeleted = updatedList.getToBeDeleted();
    log.info("List fetched with " + toBeUpdated.size() + " valid entries to be updated and " + toBeDeleted.size() + " entries marked for deletion. ");
    log.info("Pushing to DB...");
    dataService.importAll(toBeUpdated);
}

@EventListener
public void onStart(ContextStartedEvent start){
    log.info("Application started.");
    doTheJob();
    log.info("Import finished.");
    SpringApplication.exit(start.getApplicationContext(), () -> 0);
}

@ExceptionHandler(value = Exception.class)
public String outOnException(Exception e){
    log.error("Exception occurred see logs. Stopping..");
    SpringApplication.exit(context, () -> -1);
    return "dying";
}

}

一切正常,但当我抛出一个IllegalArgumentException时,@ExceptionHandler方法不会被调用。首先,我有一个没有参数的void方法,然后我开始尝试使用字符串返回和至少一个参数--这是不需要的。

这怎么行?有没有更好的方法让我的案例对每一个例外做出反应?

共有1个答案

鲜于子琪
2023-03-14

spring中的Controller Advices是一种旨在在spring MVC级别上正确处理异常的机制。

Spring MVC简而言之是一个web框架,因此,它假设您有某种webendpoint,由最终用户或前端调用。这个endpoint是后端代码的“入口点”,它可以提供服务、查询数据库等等。如果在这个后端流程中抛出了异常,您通常不希望webendpoint返回500个内部服务器错误,因此spring提供了方便地映射这些异常的工具:使用“好看的”消息和正确的HTTP代码将它们转换为json,等等。

如果你没有任何控制器,那么控制器advices的整个概念在你的流中是不适用的,所以使用它没有任何意义……

现在真正的问题是,您到底想通过这种异常处理实现什么?如果应用程序上下文无法启动,通常spring boot应用程序将优雅地关闭...

如果您希望以编程方式关闭应用程序,请确保您已经阅读了此线程

 类似资料:
  • 我使用以下代码设置了一个异常处理程序 我正在使用Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会出现这种方法。但与其他例外情况一样工作正常。这是它应该工作的方式吗?还是我的代码有问题? 这看起来像一个解决方案。但是,如果我能在一个点上处理异常,那就更好了。 这是我的配置文件 更新 此处,用户未通

  • 在Spring Boot1.5.3中,我的@ControllerAdvice注释了ExceptionHandler有一个特殊的情况。它捕获任何异常默认异常,但如果我抛出一个自定义异常,它不会激发。 ExceptionHandler: 最上面的3个异常都被捕获并按预期处理,但最下面的异常由默认的Spring-Boot ExceptionHandler处理。这是我在控制器内部抛出的自定义异常: 我试着

  • 我使用的是Spring Boot1.5.7。我有一个ExceptionHandler用于返回ResponseEntity的异常 在返回ResponseEntity/@responseBody(JSON/XML响应)的api调用期间发生异常的情况下,这种方法工作得很好 null

  • 我有一个Spring4应用程序,它有一个ControllerAdvice扩展了ResponseEntityExceptionHandler,当出现异常时可以正常工作。 然而,在解组器异常情况下,例如 这正常吗?我认为ControllerAdvice可以集中所有的异常处理,从而不需要在每个控制器中都有ExceptionHandler。

  • 我有一个使用的自定义记录器,我希望它总是在最后一次运行,这样无论控制器返回什么响应,它都将被记录到数据库中(所以我在这个方面放了一个)。我还使用编写了一个错误处理程序,它处理所有意外的异常并返回,并带有自定义响应体,我希望日志记录器也记录它,因此我在它上添加了,但是看起来注释并没有在Spring方面和Spring ControllerAdvision之间安排顺序,那么如何让错误处理程序始终在日志记

  • 我正在使用Spring Boot 1.5.9开发我的应用程序。我需要实现jwt身份验证,我使用了jjwt库。以下代码来自我的自定义身份验证安全筛选器,它继承自。在这里,我试图从令牌解析用户名,当自动解析用户名时,jwt会验证用户名,并检查令牌的过期时间。我调试了它,它可以工作,所以接下来我想向客户端应用发送正确的消息,说明身份验证失败的原因。我想抛出一个ExpiredJwtException,并使