0

我正在尝试为我的应用程序创建一个全局 ExceptionMapper,这个 ExceptionMapper 将在控制台中显示异常,然后以美化方式再次显示它,然后将它的一些信息保存在数据库中,以便将来更容易识别这些事件。

我的应用程序使用com.sun.jersey.spi.spring.container.servlet.SpringServlet,我发现我可以使用带有 ExceptionMapper 的 Provider 来拦截异常,所以我做了这个:

package es.companyName.appName.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Named
@Priority(1)
@Provider
public class UncaughtExceptionHandler extends Throwable implements ExceptionMapper<Throwable> {

    private static final long serialVersionUID = 1L;
    
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    public UncaughtExceptionHandler () {
        logger.info("Provider UncaughtExceptionHandler creado correctamente");
    }
    
    @Override
    public Response toResponse(Throwable ex) {
        //some stuff
        ...
    }
}

我以这种方式在我的 web.xml 中声明了它:

<servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>es.companyName.appName.rs, es.companyName.appName.config</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

有了这个,我的 ExceptionMapper 工作正常,但由于某种原因,它并不总是有效,当我编译和部署我的应用程序时,有时工作,有时不工作,而无需更改任何代码。

当我的 ExceptionMapper 不起作用并且没有进入那里时,我尝试调试它,就像我的 ExceptionMapper 没有正确加载一样......在控制台中,它似乎正在正确加载:

appName 2020-12-29 14:45:10.638 --- appName.config.UncaughtExceptionHandler : Provider UncaughtExceptionHandler creado correctamente
...
    INFO: Scanning for root resource and provider classes in the packages:
      es.companyName.appName.rs
      es.companyName.appName.config
    Dec 29, 2020 4:43:28 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Root resource classes found:
    ......
    Dec 29, 2020 4:43:28 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Provider classes found:
      class es.companyName.appName.config.UncaughtExceptionHandler

但这不是因为我不能在那里进行调试,就像部署忽略了我的映射器......我还有什么要留下的吗?这应该是我缺少的一些配置,但奇怪的是有时它可以正常工作,我什至可以在那里停止调试器。

我在一些相关文章中读到说,由于 jersey 试图在其映射器列表(包括一些 jersey 默认映射器)中找到给定异常的最佳匹配,因此您必须将映射器映射到您试图捕获的确切异常,因为映射器的顺序是任意的,但在我的情况下,我不想映射一些特定的异常,而是我的应用程序中的所有异常。

由于我的应用程序中没有任何其他映射器,因此执行此操作的映射器应该是球衣默认映射器,有没有办法关闭它们?还是我错过了什么?

非常感谢您的回答。

4

0 回答 0