我正在尝试为我的应用程序制作一个全局异常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器,有没有方法将其关闭?还是我遗漏了什么?
非常感谢你的回答。
暂无答案!
目前还没有任何答案,快来回答吧!