在向请求添加自定义标头时,Axis 2和rampart问题

时间:2013-02-13 11:47:14

标签: java web-services axis2 axis rampart

<soapenv:Envelope> 
<soapenv:Header>    
      <cor:india>test</cor:india>
     </soapenv:Header>

<soapenv:Body>
.
.
</soapenv:Body>
</soapenv:Envelope>

     OMFactory omFactory =OMAbstractFactory.getOMFactory();
    OMNamespace omNamespace = omFactory.createOMNamespace("http://example.com/...", "cor");
    OMElement header = omFactory.createOMElement("india", omNamespace);
    header.setText("test");
    stub._getServiceClient().addHeader(header);

我想将自定义标头添加到使用轴2和rampart的soap请求中。 但下面是我得到的例外

Caused by: org.apache.rampart.RampartException: Error in extracting message properties
    at org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:379)
    at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
    at org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65)
    ... 10 more
Caused by: org.apache.ws.security.WSSecurityException: Error in converting SOAP Envelope to Document; nested exception is: 
    java.lang.ClassCastException: org.apache.axiom.om.impl.llom.OMElementImpl cannot be cast to org.apache.axiom.soap.SOAPHeaderBlock
    at org.apache.rampart.util.Axis2Util.getDocumentFromSOAPEnvelope(Axis2Util.java:191)
    at org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:270)
    ... 12 more
Caused by: java.lang.ClassCastException: org.apache.axiom.om.impl.llom.OMElementImpl cannot be cast to org.apache.axiom.soap.SOAPHeaderBlock
    at org.apache.rampart.util.Axis2Util.getDocumentFromSOAPEnvelope(Axis2Util.java:141)
    ... 13 more

1 个答案:

答案 0 :(得分:0)

如果您尝试使用此处提供的提示Example Custom Headers添加标题,以及在使用“壁垒”进行操作时,您可能会遇到上述问题。

解决方案是在META-INF中添加您自己的module.xml,并添加您要添加​​自定义标题的输出流

<module name="test" class="exampleClass">

    <OutFlow>

            <handler name="handle" class="exampleClass">
                <order phase="Security"  />
            </handler>
        </OutFlow>
</module>

=============================================== ===================================

public class exampleClass AbstractHandler implements org.apache.axis2.modules.Module {

public InvocationResponse invoke(MessageContext ctx) throws AxisFault {

SOAPEnvelope env = ctx.getEnvelope();
SOAPHeader hdr = env.getHeader();

SOAPFactory factory = (SOAPFactory) env.getOMFactory();

OMNamespace ns = factory.createOMNamespace("http://google.com", "cor");

//SOAPHeader head = factory.createSOAPHeader(env);

hdr.addHeaderBlock("india", ns).setText("value here");

return InvocationResponse.CONTINUE;
}


public void applyPolicy(Policy arg0, AxisDescription arg1) throws AxisFault {
    // TODO Auto-generated method stub

}

public boolean canSupportAssertion(Assertion arg0) {
    // TODO Auto-generated method stub
    return false;
}

public void engageNotify(AxisDescription arg0) throws AxisFault {
    // TODO Auto-generated method stub

}

public void init(ConfigurationContext arg0, AxisModule arg1) throws AxisFault {
    // TODO Auto-generated method stub

}

public void shutdown(ConfigurationContext arg0) throws AxisFault {
    // TODO Auto-generated method stub

} }

=============================================== =================================

在客户端使用您的模块之前,像

那样
Options options = serviceClient.getOptions();
serviceClient.engageModule("test");

options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,loadPolicy("policy.xml"));
serviceClient.engageModule("rampart");
..

...