java - 嵌入 Jetty 时如何将 AxisConfiguration 传递给 AxisServlet

标签 java ssl apache-axis embedded-jetty mutual-authentication

一些背景:

我正在尝试对我们公开的某些 Axis2 服务使用 SSL 相互身份验证。问题是 Axis2 内置服务器不支持它。所以我想使用嵌入式 Jetty 来实现它并在其中部署 AxisServlet。

问题:

似乎无法将 AxisConfiguration(包含所有可用服务的定义)直接传递给 servlet。

我是如何尝试做到这一点的:

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();

该方法的问题是 AxisServlet 的 init(ServletConfig) 方法永远不会被调用,所以每当我尝试调用 8080 上的服务时,我都会收到 nullPointer 异常:

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 不发送初始化参数并且不调用 servlet 上的 init(ServletConfig config) 方法?我通过调试器确认它从未被调用。

最佳答案

如果你想加载配置上下文,你可以尝试直接从文件系统加载配置上下文,如下所示。

ConfigurationContext myConfigContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem("", "axis2.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>

关于java - 嵌入 Jetty 时如何将 AxisConfiguration 传递给 AxisServlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166696/

相关文章:

eclipse - 使用 Eclipse 导出一个独特的 war holding RESTlet 和 Servlet 一起为 Tomcat 工作

java - WCF FaultException<T> 是否支持与 Java Web 服务故障的互操作

java - Axis WSDL2Java 生成问题

java使用 float 和 double 进行计算

java - 如何从适用于多个类类型的方法返回实际类型而不是对象类型?

Node.js 多个 SSL 证书

java ssl tcp 连接正常,但接收到服务器的数据不正确

java - 为什么在我启动服务器时 Tomcat 不启动连接器?

java - 从 yyyy-mm-dd 获取当前月份

python - 如何在第三方 python 库中禁用 SSL 验证?