1
<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 と壁を使用していた 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
4

1 に答える 1

0

ここで提供されているヒントを使用してヘッダーを追加しようとしている場合カスタムヘッダーの例と、ランパートを使用して関与している場合、上記の問題に直面する可能性があります.

そのための解決策は、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");
..

..

于 2013-02-16T06:45:01.730 に答える