jerseyservlet-exceptionmapper在部署时并不总是工作

kadbb459  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(195)

我正在尝试为我的应用程序制作一个全局异常Map,这个异常Map将在控制台中显示异常,然后以一种漂亮的方式再次显示它,然后将它的一些信息保存在数据库中,以便将来更容易识别这些事件。
我的应用程序使用 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工作得很好,但由于某些原因,它并不总是工作,当我编译和部署我的应用程序时,有时工作,有时不工作,而不更改任何代码。
我试图调试我的异常时,它不工作,它是没有进入那里,就像我的异常是没有正确加载。。。在控制台中,似乎正在正确加载:

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

但这并不是因为我不能停止调试,就像部署忽略了我的Map器。。。有我留下的东西吗?这应该是一些配置的东西,我错过了,但奇怪的是,有时它工作正常,我甚至可以停止调试器在那里。
我在一些相关文章中读到,由于jersey正试图在其Map器列表(其中包括一些jersey默认Map器)中为给定的异常找到最佳匹配,因此您必须将Map器Map到您正试图捕获的确切异常,由于Map程序的顺序是任意的,但在我的情况下,我不想Map一些特定的异常,但我的应用程序中的所有异常。
由于我的应用程序中没有任何其他Map器,所以正在执行此操作的Map器应该是泽西岛的默认Map器,有没有方法将其关闭?还是我遗漏了什么?
非常感谢你的回答。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题