Java OSGI中的全局servlet异常处理。怎么用?
有没有一种方法可以全局处理Servlet中抛出的osgi(karaf)中未经检查的异常 我的意思是类似于Java OSGI中的全局servlet异常处理。怎么用?,java,exception,servlets,osgi,karaf,Java,Exception,Servlets,Osgi,Karaf,有没有一种方法可以全局处理Servlet中抛出的osgi(karaf)中未经检查的异常 我的意思是类似于Spring,其中有@ControllerAdvice,您可以为每个异常类型指定方法并处理它 我想在我的rest api中统一异常处理,该api公开osgi服务。在osgi中执行rest 您在这个问题中提到了REST和servlet。如果您在OSGi中使用REST,那么JAX-RS白板是最简单的方法。如果您想使用原始servlet,那么Http白板就是一个不错的选择。这两种模型都可以轻松处理异
Spring
,其中有@ControllerAdvice
,您可以为每个异常类型指定方法并处理它
我想在我的rest api中统一异常处理,该api公开osgi服务。在osgi中执行rest
您在这个问题中提到了REST和servlet。如果您在OSGi中使用REST,那么JAX-RS白板是最简单的方法。如果您想使用原始servlet,那么Http白板就是一个不错的选择。这两种模型都可以轻松处理异常
更新
为了让人们更容易了解它是如何工作的,我创建了一个工作示例,其中包括servlet和JAX-RS错误处理
使用HTTP白板
HTTP白板允许将servlet注册为OSGi服务,然后用于处理请求。请求处理的一种类型是充当错误页
错误页面使用osgi.http.whiteboard.servlet.errorPage
属性注册。此属性的值是一个或多个字符串,其中包含:
- 应处理的异常的完全限定类名
- 三位数的错误代码
IOException
、NullPointerException
以及状态代码401
和403
调用此servlet:
@Component
@HttpWhiteboardServletErrorPage(errorPage = {"java.io.IOException", "java.lang.NullPointerException", "401", "403"})
public class MyErrorServlet extends HttpServlet implements Servlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws Exception {
Throwable throwable = (Throwable) request
.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
// Do stuff with the error
}
}
注意:我使用了OSGi R7组件属性类型注释来简化阅读。它将同样适用于DS和Http白板的旧版本
使用JAX-RS白板
JAX-RS白板。在这种情况下,您需要一个例外标记
在本例中,我们为IOException
@Component
@JaxrsExtension
public class MyExceptionMapper implements ExceptionMapper<IOException> {
Response toResponse(IOException e) {
// Create a response
}
}
@组件
@JAXRExtension
公共类MyExceptionMapper实现ExceptionMapper{
响应响应(IOE异常){
//创建响应
}
}
您好,非常感谢您的建议。我尝试过使用@HttpWhiteboardServletErrorPage
的方法,但似乎不起作用。我的依赖项是:org.osgi.service.component.annotations 1.3.0、org.osgi.annotation 6.0.0、org.osgi.service.metatype.annotations 1.3.0、org.osgi.core 4.3.0、org.osgi.compendium 4.2.0、org.osgi.service.http.whiteboard 1.0、org.apache.felix.configadmin 1.8.16。我在我的一个servlet中抛出了一个异常,但它没有重定向到我的新servlet,该servlet标记有errorPage注释。正如我在响应中提到的,这些示例使用OSGi R7(以使它们更易于阅读)。这还要求构建工具使用bnd 4.1.0(支持DS 1.4的第一个版本)。如果您想使用DS 1.3(来自OSGi R6),那么最好使用老式的方式添加服务属性(使用组件注释的属性元素)。