无法在Axis2客户端项目中加载Rampart模块



虽然我的项目是一个Java web应用程序,但我只使用web服务作为客户端。

我成功地用Apache Axis2创建了存根,并用SoapUI对它们进行了测试。现在是实现安全性的时候了。这是我必须集成的服务之一。它附带了一个WS-Security策略,因此我必须正确地传输我的凭据。

我想把Apache Rampart集成到我的项目中。我发现下载所需的jar和MAR文件有很多困难,但我做到了。

现在我有了下面的项目结构:

webapp
   -- WEB-INF
       -- classes
       -- conf
          -- axis2.xml
       -- modules
          -- several -mar files
          -- rampart-1.6.2.mar
          -- modules.list
       -- spring
          -- various context files
       -- web.xml

我使用Spring初始化所有bean,包括web服务存根。如果我让Spring正常地实例化它们,它们就会按预期工作。但是当我使用BeanPostProcessor连接壁垒模块时,它将失败

Caused by: org.apache.axis2.AxisFault: Unable to engage module : rampart
at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:363)
at it.csttech.edwin.security.SecurityHandler.engage(SecurityHandler.java:52)

在我的axis2.xml中,我在addressing之后添加了<module ref="rampart" />

我用下面的代码启用Rampart:

    RampartConfig rc = new RampartConfig();
    rc.setUser(user);
    Policy policy = PolicyEngine.getPolicy(new StAXOMBuilder(policyStream).getDocumentElement()); //XML policy file in classpath
    policy.addAssertion(rc);
    serviceClient.engageModule("rampart"); //this fails
    Options options = serviceClient.getOptions();
    options.setProperty(WSHandlerConstants.PW_CALLBACK_REF, callbackHandler); //This will provide password
    options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, policy); //This will provide policy

我发现,如果我做Map<String, AxisModule> modules = serviceClient.getAxisConfiguration().getModules();我只是得到一个空地图!!!!

所以没有模块被加载。

然后我尝试将modules/目录移动到硬盘上的另一个位置,并通过系统属性axis2.repo链接它,但是如果我故意设置了一个错误的路径,即使Axis2不会加载,它也不会加载rampart-1.6.2.mar文件,并且映射仍然是空的。

我快疯了。我不知道如何正确地将Rampart加载到我的设置中。我甚至不知道Spring IoC是否可以用于注入适当的配置和/或在所有服务中使用Rampart。

您可以尝试创建ConfigurationContext并使用它获取ServiceClient。

// create configuration context
ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(RESOURCES_DIR, null);
// create service client
ServiceClient serClient = new ServiceClient(ctx, null);
// engage modules
serClient.engageModule("rampart");

其中'RESOURCES_DIR'应该指向你的。mar文件的位置

最新更新