2014-03-12 75 views
1

雖然我的項目是Java Web應用程序,但我僅將Web服務用作客戶端。無法在Axis2客戶端項目中加載Rampart模塊

我成功創建了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來初始化所有的豆類,包括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" />啓用壁壘用下面的代碼:

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將其鏈接,但即使Axis2不會加載,如果我擅自設置不良路徑,它也不會加載rampart-1.6.2.mar文件和地圖將仍爲空。

我越來越瘋狂。我不知道如何正確加載Rampart到我的設置中。我甚至不知道Spring IoC是否可以用於注入適當的配置和/或讓Rampart參與所有服務。

回答

0

您可以嘗試創建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"); 

Where'RESOURCES_DIR'應指向您的.mar文件的位置。

+0

同樣的錯誤。我三重檢查了System.getProperty(「axis2.repo」)的價值是否正確,即「C:/ path/to/modules /」 –