JerseyServlet - ExceptionMapper 在部署时并不总是有效

问题描述

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

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

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

但这不是因为我不能在调试中止步,就像部署忽略了我的映射器......我还有什么遗漏吗?它应该是我遗漏的一些配置内容,但奇怪的是有时它可以正常工作,我什至可以在那里使用调试器来停止。

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

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

非常感谢您的回答。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)