虽然我的项目是一个 Java 网络应用程序,但我仅将网络服务用作客户端。
我使用 Apache Axis2 成功创建了 stub ,并使用 SoapUI 测试了它们。现在是实现安全性的时候了。 This is我必须整合的服务之一。它附带一个 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 服务 stub 。如果我让 Spring 正常实例化它们,它们将按预期工作。但是当我使用 BeanPostProcessor
接合 rampart 模块将失败
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 中,我添加了 <module ref="rampart" />
在 addressing
之后
我使用以下代码启用 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();
我刚得到一张空 map !!!!!!
所以根本没有加载任何模块。
然后我尝试将 modules/目录移动到我硬盘上的另一个位置,并通过系统属性 axis2.repo
链接它但即使 Axis2 不会加载,如果我故意设置错误的路径,它也不会加载 rampart-1.6.2.mar
文件和 map 仍然是空的。
我快疯了。我不知道如何将 Rampart 正确加载到我的设置中。我什至不知道 Spring IoC 是否可用于注入(inject)正确的配置和/或让 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 文件的位置。
关于java - 无法在 Axis2 客户端项目中加载 Rampart 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22359274/