如何在JavaSpring中处理全局异常?

如何在JavaSpring中处理全局异常?,java,spring,exception,constructor-injection,Java,Spring,Exception,Constructor Injection,目前,我正在开发一个小型系统来记录所有未捕获的异常,并将它们存储到数据库中,以便进一步调试/开发。 为此,我对特定线程使用UncaughtExceptionHandler: public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler{ @Autowired private LoggedExceptionService service; public GlobalExce

目前,我正在开发一个小型系统来记录所有未捕获的异常,并将它们存储到数据库中,以便进一步调试/开发。 为此,我对特定线程使用UncaughtExceptionHandler:

public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler{

    @Autowired
    private LoggedExceptionService service;


    public GlobalExceptionHandler() {
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.err.println("IN UNCAUGHTEXCEPTION METHOD");
        this.service.saveException(new LoggedException(e));
    }
}
正如您所看到的,
service
字段被注入,当我捕获到异常时,我会得到一个NullPointerException,因为该字段为null

主要问题是GlobalExceptionHandler的使用。如果我使用构造函数进行注入(如本代码段中所示):

然后该字段不为null,但我不能将其声明为异常处理程序,因为我不能将其自动关联到java本机方法。电话将是:

Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler());

是否有可能将处理程序自动连接到线程方法,或者什么是一个好方法?

将其作为一个组件,并在
@postcontract
方法中设置derault异常处理程序

@组件
公共类GlobalExceptionHandler实现Thread.UncaughtExceptionHandler{
@自动连线
私人LoggedExceptionService服务;
公共GlobalExceptionHandler(){
}
@施工后
公共void init(){
setDefaultUncaughtExceptionHandler(this);
}
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
System.err.println(“在UNCAUGHTEXCEPTION方法中”);
this.service.saveException(新的LoggedException(e));
}
}
这允许您自动设置处理程序,因为组件中带有
@postcontract
注释的方法在启动时自动执行

使
GlobalExceptionHandler
成为一个spring组件还允许自动连接
服务
,否则将无法设置该服务。无论如何,我建议您使用自动布线:

@组件
公共类GlobalExceptionHandler实现Thread.UncaughtExceptionHandler{
专用最终日志DexceptionService服务;
@如果Autowired/@Autowired是唯一的构造函数,则实际上不需要它
公共GlobalExceptionHandler(LoggedExceptionService服务){
这个。服务=服务
}
@施工后
公共void init(){
setDefaultUncaughtExceptionHandler(this);
}
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
System.err.println(“在UNCAUGHTEXCEPTION方法中”);
this.service.saveException(新的LoggedException(e));
}
}

将其作为一个组件,并在
@postcontract
方法中设置derault异常处理程序

@组件
公共类GlobalExceptionHandler实现Thread.UncaughtExceptionHandler{
@自动连线
私人LoggedExceptionService服务;
公共GlobalExceptionHandler(){
}
@施工后
公共void init(){
setDefaultUncaughtExceptionHandler(this);
}
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
System.err.println(“在UNCAUGHTEXCEPTION方法中”);
this.service.saveException(新的LoggedException(e));
}
}
这允许您自动设置处理程序,因为组件中带有
@postcontract
注释的方法在启动时自动执行

使
GlobalExceptionHandler
成为一个spring组件还允许自动连接
服务
,否则将无法设置该服务。无论如何,我建议您使用自动布线:

@组件
公共类GlobalExceptionHandler实现Thread.UncaughtExceptionHandler{
专用最终日志DexceptionService服务;
@如果Autowired/@Autowired是唯一的构造函数,则实际上不需要它
公共GlobalExceptionHandler(LoggedExceptionService服务){
这个。服务=服务
}
@施工后
公共void init(){
setDefaultUncaughtExceptionHandler(this);
}
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
System.err.println(“在UNCAUGHTEXCEPTION方法中”);
this.service.saveException(新的LoggedException(e));
}
}

谢谢!施工后的情况非常好。我将注入更改为构造函数注入。编辑:我会尽快接受。哈哈,我正在把它添加到答案中。我想我更快了=P谢谢,伙计,你让我开心了:)谢谢!施工后的情况非常好。我将注入更改为构造函数注入。编辑:我会尽快接受。哈哈,我正在把它添加到答案中。我想我更快了=P谢谢你,你让我开心了:)
Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler());