0
votes

We´re getting this error:

The endpoint reference (EPR) for the Operation not found is [OUR ENDPOINT] and the WSA Action = . If this EPR was previously reachable, please contact the server administrator.

Our SOAPActions are declared as "", as allowed by specification.

The following answer explains why it´s happening: https://stackoverflow.com/a/15556669/1553243. However, we can´t afford the suggested workarounds, 1 and 3. We can´t have our vendors declare their SOAPActions, and we can´t have our clients always append the operation name. Workaround 2 doesn´t work when SOAPAction = "", either.

The answer also states they were in a process of fixing this limitation, but I´m using a one year later release and nothing.

Is there any other workaround?

Our proxy is defined like:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TEST"
       transports="https,http"
       statistics="enable"
       trace="enable"
       startOnLoad="true">
   <target>
      <inSequence>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
      <faultSequence>
         <log/>
      </faultSequence>
      <endpoint>
         <wsdl service="TESTService"
               port="TESTServicePort"
               uri="http://localhost:8080/test?wsdl"/>
      </endpoint>
   </target>
   <publishWSDL uri="http://localhost:8080/test?wsdl"/>
   <description/>
</proxy>
4

4 Answers

2
votes

Since ESB v4.8, using pass-through http transport, you can add this parameter to your proxy def :

<parameter name="disableOperationValidation" locked="false">true</parameter>
1
votes

In your webservice implementation class add the annotation @WebMethod to define the SOAP Action for individual operations. for example

@WebService
@SOAPBinding(style=Style.RPC)
public class BookingServiceWS {
    @WebMethod(action="getBooking",operationName="getBooking")
    public BookingServiceResponse getBooking(String pnr){
}

This will generate the WSDL with SOAP Action defined as

<operation name="getBooking">
<soap:operation soapAction="getBooking"/>
<input>...</input>
<output>...</output>
</operation>

This should be able to resolve the issue

0
votes

Then you have control at ESB level? If so, you define the SOAPAction property at ESB level. That is, when request hits the sequence, if you are sure where to route the request, at that time set SOAPAction property before the send mediator

   <property name="SOAPAction" value="urn:OPERATION NAME"
 scope="transport"/>
0
votes

Workaround 2: You can specify the SOAPAction in the client side code. Specify it in the options as shown below.

options.setAction("urn:SOAPAction");