Ошибка регистрации обработчика ошибок Jetty в Pax Web

Я пытаюсь зарегистрировать пользовательский обработчик ошибок в Jetty 8, который встроен в контейнер Pax Web OSGi. Я добавляю следующую базовую конфигурацию 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 обертывает класс Jetty Server своим JettyServerWrapper, и его нельзя установить с помощью конфигурации Reflection из xml. Когда я копался в исходном коде Jetty, я обнаружил, что этот код связан с отражающей конфигурацией из xml:

Из внутреннего класса JettyXmlConfiguration org.eclipse.jetty.xml.XmlConfiguration:

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;
     }
     ...
}

Из кода видно, что метод set XmlConfiguration пытается получить только метод определенного типа, но не ищет родительские классы. Вот почему экземпляр сервера Pax-wrapped не может быть установлен в пользовательском обработчике ошибок.

Таким образом становится недоступным для настройки Jetty с использованием XML. Есть ли у вас какие-либо решения?

1 ответ

Вы можете найти описание того, как настроить Jetty, можно найти в документации: http://ops4j.github.io/pax/web/SNAPSHOT/User-Guide.html.

Кроме того, вот краткий итог:

<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 таким образом, чтобы определить, как начать, вам нужно "адаптировать" работающий экземпляр.

Другие вопросы по тегам