Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring启动应用程序中未调用Thread.setDefaultUncaughtExceptionHandler_Java_Spring_Maven_Spring Boot - Fatal编程技术网

Java Spring启动应用程序中未调用Thread.setDefaultUncaughtExceptionHandler

Java Spring启动应用程序中未调用Thread.setDefaultUncaughtExceptionHandler,java,spring,maven,spring-boot,Java,Spring,Maven,Spring Boot,我试图在spring引导应用程序中实现一个全局未捕获异常处理程序,它从一组客户端应用程序中收集度量和异常等。似乎是在调试时设置了处理程序,所以我会假设在代码运行后分配了另一个处理程序,或者没有在spring应用程序上下文中设置这些处理程序?我的代码如下 我已为默认异常处理程序创建了此类- public class JvmrtExceptionHandler implements Thread.UncaughtExceptionHandler { private static final Log

我试图在spring引导应用程序中实现一个全局未捕获异常处理程序,它从一组客户端应用程序中收集度量和异常等。似乎是在调试时设置了处理程序,所以我会假设在代码运行后分配了另一个处理程序,或者没有在spring应用程序上下文中设置这些处理程序?我的代码如下

我已为默认异常处理程序创建了此类-

public class JvmrtExceptionHandler implements Thread.UncaughtExceptionHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(JvmrtExceptionHandler.class);
private RestTemplate restTemplate = new RestTemplate();

@Override
public void uncaughtException(Thread thread, Throwable exception) {
    String exceptionClass = exception.getStackTrace()[0].getClassName();
    String exceptionMethod = exception.getStackTrace()[0].getMethodName();
    String exceptionMessage = exception.getMessage();
    String exceptionType = exception.getClass().getSimpleName();
    String appName = exception.getClass().getPackage().getImplementationTitle();
    ExceptionModel thrownException = new ExceptionModel(
            exceptionMessage,
            appName,
            exceptionMethod,
            exceptionClass,
            exceptionType
    );

    LOGGER.error("Uncaught Exception thrown of type {}. Sending to JVMRT Main app for processing", exceptionType);

    String exceptionUrl = String.format("http://%s:%s/api/", "localhost", 8090);
    restTemplate.postForObject(exceptionUrl, thrownException, String.class);



}
}

在另一个应用程序中,这个类将前一个应用程序作为maven依赖项,配置我创建的默认处理程序。我希望处理程序适用于所有线程,因此我使用了static Thread.setDefaultUncaughtExceptionHandler方法来设置它

@Configuration
public class Config {

    @Bean
    public JvmrtExceptionHandler jvmrtExceptionHandler() {
        JvmrtExceptionHandler exceptionHandler = new JvmrtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
        return exceptionHandler;
    }
}
我正在用以下代码测试处理程序

@RestController
@RequestMapping(value = "/test")
public class ExceptionTest {

        @RequestMapping(value = "/exception", method = RequestMethod.GET)
        public void throwException() {
           throw new RuntimeException();
        }

}

我做错了什么?真是让我头疼,任何帮助都将不胜感激。

因为您的运行时异常被embed tomcat捕获。您可以在org.apache.catalina.core.StandardWrapperValve.invoke中找到try catch。 它打印完整的异常消息,并将错误放入响应中


如果要在spring请求映射中捕获异常,可以尝试ControllerAdviceExceptionHandler

因为您的运行时异常被embed tomcat捕获。您可以在org.apache.catalina.core.StandardWrapperValve.invoke中找到try catch。 它打印完整的异常消息,并将错误放入响应中


如果要在spring请求映射中捕获异常,可以尝试ControllerAdviceExceptionHandler

让它与ExceptionHandler一起工作。谢谢你的帮助。我使用ControllerAdvice,发现@Async中的异常不会被捕获。你知道怎么处理这个案子吗?让ExceptionHandler来处理吧。谢谢你的帮助。我使用ControllerAdvice,发现@Async中的异常不会被捕获。你知道怎么处理这个案子吗?