在类介体WSO2 ESB的中介中发生错误

时间:2019-05-31 05:30:07

标签: proxy wso2 wso2esb

我使用wso2 esb 5.0创建代理服务。我使用类介体创建了代理服务。下面是java类。

public class CalculatePaymentAmount extends AbstractMediator {

    public boolean mediate(MessageContext messageContext) {

        String noOfMonths = messageContext.getEnvelope().getBody().getFirstElement().
                getFirstChildWithName(new QName("noOfMonths")).getText();

        String InsuranceRate = messageContext.getEnvelope().getBody().getFirstElement().
                getFirstChildWithName(new QName("InsuranceRate")).getText();

        DecimalFormat decimalFormat = new DecimalFormat("#.##");

        double totalAmount = Double.parseDouble(noOfMonths) * Double.parseDouble(InsuranceRate);

        messageContext.setProperty("noOfMonths", noOfMonths);
        messageContext.setProperty("paymentAmount", decimalFormat.format(totalAmount));

        return true;
    }

    public String getType() {
        return null;
    }

    public void setTraceState(int traceState) {
        traceState = 0;
    }

    public int getTraceState() {
        return 0;
    }

}

我使用类介体创建了代理服务。在下面定义代理代码。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="PaymentAmountProxy"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log/>
         <class name="com.mediator.java.CalculatePaymentAmount"/>
         <property expression="get-property('default','noOfMonths')"
                   name="getNoOfMonths"
                   scope="default"
                   type="STRING"/>
         <property expression="get-property('default','paymentAmount')"
                   name="getPaymentAmount"
                   scope="default"
                   type="STRING"/>
         <log>
            <property expression="get-property('default','getNoOfMonths')"
                      name="No.Of Months:"/>
            <property expression="get-property('default','getPaymentAmount')"
                      name="Paymrent Amount:"/>
         </log>
      </inSequence>
   </target>
   <description/>
</proxy>

此功能正常,并给出了预期的响应。 但是,当我将此类介体与其他介体一起使用时,调用代理服务时会出错。 下面提到了我与类介体一起使用的代理服务。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="LatestLicenseRenewalSystem"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log/>
         <property expression="get-property('transport','VehicleNo')"
                   name="vehicleNo"
                   scope="default"
                   type="STRING"/>
         <log>
            <property expression="get-property('default','vehicleNo')" name="VehicleNo"/>
         </log>
         <payloadFactory media-type="xml">
            <format>
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                 xmlns:wsa="http://www.w3.org/2005/08/addressing"
                                 xmlns:sam="http://sample.esb.org">
                  <soapenv:Header/>
                  <soapenv:Body>
                     <sam:getPolicyID>
                        <sam:vehicleNumber>$1</sam:vehicleNumber>
                     </sam:getPolicyID>
                  </soapenv:Body>
               </soapenv:Envelope>
            </format>
            <args>
               <arg evaluator="xml" expression="get-property('default','vehicleNo')"/>
            </args>
         </payloadFactory>
         <log level="full"/>
         <header name="Action" scope="default" value="urn:getCertificateID"/>
         <call>
            <endpoint>
               <address format="soap12"
                        uri="http://172.17.0.1:9763/services/EmissionTestService.EmissionTestServiceHttpSoap12Endpoint/">
                  <enableAddressing/>
               </address>
            </endpoint>
         </call>
         <log level="full"/>
         <property xmlns:ns="http://sample.esb.org"
                   expression="//ns:getCertificateIDResponse/ns:return"
                   name="certificateID"
                   scope="default"
                   type="STRING"/>
         <log>
            <property expression="get-property('default','certificateID')"
                      name="CertificateID"/>
         </log>
         <class name="com.mediator.java.CalculatePaymentAmount"/>
         <property expression="get-property('default','noOfMonths')"
                   name="getNoOfMonths"
                   scope="default"
                   type="STRING"/>
         <property expression="get-property('default','paymentAmount')"
                   name="getPaymentAmount"
                   scope="default"
                   type="STRING"/>
         <log>
            <property expression="get-property('default','getNoOfMonths')"
                      name="No.Of Months:"/>
            <property expression="get-property('default','getPaymentAmount')"
                      name="Paymrent Amount:"/>
         </log>
         <respond/>
      </inSequence>
   </target>
   <description/>
</proxy>

调用上述代理服务时发生以下错误。

LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: urn:getCertificateIDResponse, SOAPAction: urn:getCertificateIDResponse, ReplyTo: http://www.w3.org/2005/08/addressing/anonymous, MessageID: urn:uuid:6f4557eb-b8ff-4c19-bbe8-4c7e929d8386, Direction: request, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = Error occured in the mediation of the class mediator, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>urn:getCertificateIDResponse</wsa:Action><wsa:RelatesTo>urn:uuid:6f4557eb-b8ff-4c19-bbe8-4c7e929d8386</wsa:RelatesTo></soapenv:Header><soapenv:Body><ns:getCertificateIDResponse xmlns:ns="http://sample.esb.org"><ns:return>-1250719063</ns:return></ns:getCertificateIDResponse></soapenv:Body></soapenv:Envelope> 

谁能帮我解决这个问题。任何帮助或解决方法,我们真的很感激。

2 个答案:

答案 0 :(得分:0)

您的类中介者正在从消息上下文访问元素'noOfMonths'和'InsuranceRate'。但是根据错误日志,消息上下文具有一个不同的肥皂包,其中没有上述元素。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>urn:getCertificateIDResponse</wsa:Action><wsa:RelatesTo>urn:uuid:6f4557eb-b8ff-4c19-bbe8-4c7e929d8386</wsa:RelatesTo></soapenv:Header><soapenv:Body><ns:getCertificateIDResponse xmlns:ns="http://sample.esb.org"><ns:return>-1250719063</ns:return></ns:getCertificateIDResponse></soapenv:Body></soapenv:Envelope> 

这必须是在类介体之前从调用操作收到的响应。

您必须将类介体与调用操作隔离开来,并使用其他代理服务,或者将类介体移到有效负载工厂上方。

答案 1 :(得分:0)

为解决此问题,请在类调解器之前使用有效负载工厂调解器,并设置有效负载的参数。我在代码下面提到了。

<payloadFactory media-type="xml">
            <format>
               <paymentDetails xmlns="">
                  <noOfMonths>$1</noOfMonths>
                  <InsuranceRate>$2</InsuranceRate>
               </paymentDetails>
            </format>
            <args>
               <arg evaluator="xml" expression="get-property('default','noOfMonths')"/>
               <arg evaluator="xml" expression="get-property('default','InsuranceRate')"/>
            </args>
         </payloadFactory>
         <class name="com.mediator.java.CalculatePaymentAmount"/>