Java OSGI中的全局servlet异常处理。怎么用?

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白板就是一个不错的选择。这两种模型都可以轻松处理异

有没有一种方法可以全局处理Servlet中抛出的osgi(karaf)中未经检查的异常

我的意思是类似于
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
属性注册。此属性的值是一个或多个字符串,其中包含:

  • 应处理的异常的完全限定类名
  • 三位数的错误代码
OSGi规范,以及其他可以用来找出问题所在的页面

例如,将为
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),那么最好使用老式的方式添加服务属性(使用组件注释的属性元素)。