java - Pax Web中的 jetty 错误处理程序注册错误

标签 java jetty pax-web

我正在尝试向嵌入在Pax Web OSGi容器中的Jetty 8注册一个自定义错误处理程序。我将以下基本xml配置添加到jetty.xml文件中:

<Call name="addBean">
    <Arg>
      <New class="my.custom.handler">
        <Set name="server"><Ref id="Server"/></Set>
      </New>
    </Arg>
</Call>


但是,在此配置之后,Jetty无法启动,并且我从日志文件中得到以下根本原因的错误消息:

Caused by: java.lang.NoSuchMethodException: class my.error.handler.MyErrorHandler.setServer(class org.ops4j.pax.web.service.jetty.internal.JettyServerWrapper)
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:592)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:396)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:827)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1141)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1044)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:735)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:400)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:334)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.19.v20160209]
at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:281)
... 16 more


看来Pax用JettyServerWrapper包装了Jetty的Server类,并且无法使用xml配置中的Reflection来设置。当我深入研究Jetty源代码时,我发现此代码与xml中的反射配置有关:

来自org.eclipse.jetty.xml.XmlConfiguration的内部类JettyXmlConfiguration:

private void set(Object obj, XmlParser.Node node) throws Exception
{
    ...
    // Try for trivial match
    try
    {
        Method set = oClass.getMethod(name,vClass);
        set.invoke(obj,arg);
        return;
     }
     ...
}


从代码中可以明显看出,XmlConfiguration的set方法仅尝试获取具有特定类型的方法,而不查找父类。这就是为什么不能在自定义错误处理程序上设置Pax包装的Server实例的原因。

因此,无法使用xml配置Jetty。你有什么解决方案?

最佳答案

您可以在文档中找到有关如何配置Jetty的描述:
http://ops4j.github.io/pax/web/SNAPSHOT/User-Guide.html#adding-specialized-contexthandlers

此外,这是一个快速总结:

<Get name="handler">
  <Call name="addHandler">
    <Arg>
     <New class="org.eclipse.jetty.servlet.ServletContextHandler">
       <Set name="contextPath">/app</Set>
       <Set name="resourceBase">/path/to/your/share</Set>
       <Call name="addServlet">
         <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
         <Arg>/</Arg>
       </Call>
     </New>
   </Arg>
 </Call>
</Get>


无需以定义启动方式的方式配置Jetty,而是需要“适应”正在运行的实例。

关于java - Pax Web中的 jetty 错误处理程序注册错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46543504/

相关文章:

java - 无法在具有 32 位 JVM 的 AMD 64 位平台上加载 IA 32 位 .dll

java - 使用 Eclipse 中指定的环境变量导出可运行的 jar

java - jetty "javax.net.ssl.SSLHandshakeException: no cipher suites in common"

tomcat - Grails:如何在开发环境中运行多个应用程序?

java - 在 "wrong"OSGi HttpService 上注册的 Servlet

java - 查找 Eclipse 对 Maven 项目所做的更改

java - Netbeans 8.1 Gnome 3 GTK+ UI 字体和标签高度

java - 如何将ActiveWeb Web应用程序部署到普通容器?

apache-camel - 如何为 Pax Web DefaultResourceMapping 指定 Jetty 连接器

java - 是否有在普通 Equinox 框架中运行具有 JSP 支持的 Jetty 9.4 或具有 JSP 支持的 Pax Web 的示例?