class 中介 WSO2 ESB 的中介发生错误

Error occurred in the mediation of the class mediator WSO2 ESB

我使用 wso2 esb 5.0 创建代理服务。我使用 class 中介创建了代理服务。下面是 java class.

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;
    }

}

我使用 class 中介创建了代理服务。下面定义代理代码。

<?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>

这个工作正常并给出了预期的响应。 但是,当我将此 class 调解器与其他调解器一起使用时,它会在我调用代理服务时出现错误。 下面提到了我与 class 中介一起使用的代理服务。

<?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></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> 

谁能帮我解决这个问题。非常感谢任何帮助或解决方法。

您的 class 中介正在访问消息上下文中的元素 'noOfMonths' 和 'InsuranceRate'。但是根据错误日志,消息上下文有一个不同的 soap 信封,它没有上述元素。

<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> 

这必须是 class 调解器之前从调用操作收到的响应。

您必须将 class 中介与调用操作隔离并使用不同的代理服务,或者将 class 中介移动到负载工厂之上。

为了解决这个问题,在 class 调解器之前使用 payloadFactory 调解器并设置有效负载的参数。我在下面提到了代码。

<payloadFactory media-type="xml">
            <format>
               <paymentDetails xmlns="">
                  <noOfMonths></noOfMonths>
                  <InsuranceRate></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"/>