Как передать AxisConfiguration в AxisServlet при встраивании в Jetty

Небольшая предыстория:

Я пытаюсь использовать взаимную аутентификацию SSL для некоторых предоставляемых нами сервисов Axis2. Проблема в том, что встроенный сервер Axis2 этого не поддерживает. Поэтому я хочу использовать встроенный Jetty для достижения этой цели и развернуть в нем AxisServlet.

Проблема:

Кажется, нет никакого способа передать AxisConfiguration (содержащую определение всех доступных сервисов) сервлету напрямую.

Как я пытаюсь это сделать:

ConfigurationContext context = ConfigurationContextFactory.createDefaultConfigurationContext();

File serviceArchiveFile = new File("<path to my aar file which is loaded properly>");
AxisServiceGroup serviceGroup = DeploymentEngine.loadServiceGroup(serviceArchiveFile, context);

AxisConfiguration axiConfiguration = context.getAxisConfiguration();
axiConfiguration.addServiceGroup(serviceGroup);

AxisServlet axisServlet = new AxisServlet();

Server server = new Server(8080);
org.mortbay.jetty.servlet.Context root = new org.mortbay.jetty.servlet.Context(server,"/",org.mortbay.jetty.servlet.Context.SESSIONS);
ServletHolder holder=new ServletHolder(axisServlet);

// Trying to pass the Config context via the parameters map
Map parameters = new HashMap();
parameters.put(AxisServlet.CONFIGURATION_CONTEXT, context);
holder.setInitParameters(parameters);

root.addServlet(holder,"/services/*");

server.start();

Проблема с этим подходом заключается в том, что метод init(ServletConfig) AxisServlet никогда не вызывается, поэтому я получаю исключение nullPointer всякий раз, когда пытаюсь вызвать службу на 8080:

java.lang.NullPointerException
  at org.apache.axis2.transport.http.AxisServlet.initContextRoot(AxisServlet.java:586)
  at org.apache.axis2.transport.http.AxisServlet.preprocessRequest(AxisServlet.java:605)
  at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:241)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
  at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:442)
  at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:356)
  at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:226)
  at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:615)
  at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:141)
  at org.mortbay.jetty.Server.handle(Server.java:265)
  at org.mortbay.jetty.HttpConnection.handlerRequest(HttpConnection.java:420)
  at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:666)
  at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:487)
  at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:197)
  at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:336)
  at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:183)
  at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)

Согласно исходному коду Axis2, это происходит потому, что контекст конфигурации никогда не устанавливается в AxisServlet. Итак, теперь большие вопросы:

1) Можно ли установить контекст конфигурации непосредственно в AxisServlet? Я не нашел способа сделать это

2) Почему Jetty не отправляет параметры инициализации и не вызывает метод init(ServletConfig config) для сервлета? Я подтвердил с помощью отладчика, что он никогда не вызывается.


person Kévin Isabelle    schedule 16.01.2014    source источник


Ответы (2)


Если вы хотите загрузить контекст конфигурации, вы можете попробовать загрузить контекст конфигурации непосредственно из файловой системы, как показано ниже.

ConfigurationContext myConfigContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem("", "абсолютный путь к axis2.xml");

Подробнее: http://wso2.com/library/585/

Думаю, я ответил на часть вашего вопроса.

Также, чтобы загрузить конфигурацию оси 2 в AxisServlet, добавьте приведенную ниже конфигурацию в свой файл web.xml.

<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</
servlet-class>
<init-param>
<param-name>axis2.xml.url</param-name>
<param-value>path to you axis2.xml</param-value>
<param-name>axis2.repository.url</param-name>
<param-value>path to your repo</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
person jayalalk    schedule 16.01.2014
comment
У меня все хорошо с загрузкой ConfigurationContext, все работает нормально. Проблема в том, что когда он у меня есть, я не могу установить его в AxisServlet. - person Kévin Isabelle; 16.01.2014
comment
В ответ добавлена ​​часть конфигурации AxisServlet. - person jayalalk; 16.01.2014
comment
Есть ли способ сделать это программно? Я не использую ни axis2.xml, ни web.xml. Просто встроенный код Jetty и bootstrap. Я попытаюсь передать эти 2 параметра в Jetty ServletHolder и дам вам знать, как это происходит. - person Kévin Isabelle; 16.01.2014

Вместо простого причала Context следует использовать WebAppContext. Это позволяет добавить ось2 ConfigurationContext в контекст причала.

Вот так:

Server server = new Server(1111);
WebAppContext root = new WebAppContext();
root.setAttribute(AxisServlet.CONFIGURATION_CONTEXT, context);
AxisServlet s = new AxisServlet();
ServletHolder holder = new ServletHolder(s);
root.addServlet(holder, "/axis2/*");
person pyropunk51    schedule 22.05.2014