Я использовал 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>
Может ли кто-нибудь помочь мне решить эту проблему. Любая помощь или обходные пути действительно ценятся.
Посредник вашего класса обращается к элементам 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>
Это должен быть ответ, полученный от операции вызова до посредника класса.
Вы должны либо изолировать посредник класса от операции вызова и использовать разные прокси-сервисы, либо переместить посредник класса над фабрикой полезной нагрузки.
Чтобы решить эту проблему, используйте посредник payloadFactory перед посредником класса и установите параметры полезной нагрузки. Я упомянул ниже код.
<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"/>