Как да предадете 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/

Вярвам, че отговорих на част от въпроса ви.

Също така, за да заредите axis2 config към AxisServlet, добавете по-долу config към вашия 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 и код за стартиране. Ще се опитам да предам тези 2 параметъра на Jetty ServletHolder и ще ви уведомя как върви. - person Kévin Isabelle; 16.01.2014

Вместо да използвате обикновен Context на кея, трябва да използвате WebAppContext. Това ви позволява да добавите axis2 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