2014-01-16 2 views
0

Некоторые фона:Как передать 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 paremeters и не вызывает метод init (ServletConfig config) на сервлет? Я подтвердил с помощью отладчика, что он никогда не вызывается.

ответ

1

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

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

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

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

Кроме того, чтобы загрузить axis2 конфигурацию в 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> 
+0

Я хорошо с загрузкой ConfigurationContext, он отлично работает. Проблема в том, что, как только я это сделаю, у меня нет способа установить его в AxisServlet. –

+1

Добавлена ​​часть конфигурации AxisServlet для ответа. – jayalalk

+0

Есть ли способ сделать это программно? Я не использую no2.xml и web.xml. Просто встроенный Jetty и код начальной загрузки.Я попытаюсь передать эти 2 параметра в Jetty ServletHolder и сообщить вам, как это происходит. –

0

Вместо использование простого Jetty контекста вы должны использовать 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/*"); 
Смежные вопросы