繁体   English   中英

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

[英]Cannot load Rampart module within Axis2 client project

虽然我的项目是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(); 我只是得到一张空的地图!

因此,根本不会加载任何模块。

然后我试图模块/目录移动到另一个地方,我的硬盘上,并通过系统属性链接它axis2.repo但即使如果我willignly开了一个不好的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文件的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM