我正在尝试为我的应用程序创建一个全局 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 默认映射器)中找到给定异常的最佳匹配,因此您必须将映射器映射到您试图捕获的确切异常,因为映射器的顺序是任意的,但在我的情况下,我不想映射一些特定的异常,而是我的应用程序中的所有异常。
由于我的应用程序中没有任何其他映射器,因此执行此操作的映射器应该是球衣默认映射器,有没有办法关闭它们?还是我错过了什么?
非常感谢您的回答。