虽然我的项目是Java Web应用程序,但我仅将Web服务用作客户端。
我使用Apache Axis2成功创建了存根,并使用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服务存根。如果我让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中,我在<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();
我只得到一张空地图!!!!
所以根本没有加载任何模块。
然后我尝试将modules /目录移动到我的硬盘驱动器上的另一个位置,并通过系统属性axis2.repo
将其链接,但即使Axis2不能加载,如果我将设置一个错误的路径,它只是没有加载rampart-1.6.2.mar
文件,地图仍然是空的。
我变得疯了。我不知道如何正确加载Rampart到我的设置中。我甚至不知道Spring IoC是否可用于注入适当的配置和/或在所有服务中使用Rampart。
答案 0 :(得分:1)
您可以尝试创建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; RESOURCES_DIR&#39;应指向.mar文件的位置。