webMethods

webMethods

Join this online group to communicate across IBM product users and experts by sharing advice and best practices with peers and staying up to date regarding product enhancements.

 View Only

getFaultBlock throws error

  • 1.  getFaultBlock throws error

    Posted Tue September 09, 2014 09:47 AM

    Greetings,

    I have a custom webService consumer in IntegrationServer 8.2. I have major issues trying to extract Fault information from the response message. The flow service looks like this:

    PooledSOAPClient → Returns a String with the response from the webService interface.
    ClearPipeline
    stringToBytes → Converts the String to UTF8 byte array.
    bytesToStream → Creates a Stream from the byte array.
    createMimeData → mimeData from stream.
    getBodyPartContent → Retrieves the SOAP envelope from the MIME data part.
    streamToSoapData → Builds SoapData from the BodyPartContent’s result.
    Here when debugging the service SOAPData looks like the following in the pipeline:

    The next step would be to retrieve the actual fault. Well it doesn’t go that easy I guess…
    validateSoapData → no errors so far.
    getFaultBlock → Exception being thrown. the error log:
    com.wm.app.b2b.server.saaj.SOAPMessage cannot be cast to com.wm.app.b2b.server.jaxrpc.SOAPMessageContext
    I guess the MEssageContext is not the result of streamToSoapData, but then how could I retrieve the fault information from a soapData?

    @Edit: For now I fixed this issue with a simple JavaService that basically looks like the following:

    IDataCursor inputCursor = pipeline.getCursor();
    Object inputObject = IDataUtil.get(inputCursor, "soapData");
    inputCursor.destroy();
    
    SOAPMessage soapData = null;
    if (inputObject instanceof SOAPMessage) {
    soapData = (SOAPMessage) inputObject;
    }
    
    SOAPFault FAULT = null;
    try {
    Vector bodyEntries = soapData.getBodyEntries();
    Iterator<?> iter = bodyEntries.iterator();
    while (iter.hasNext()) {
    Object bodyEntry = iter.next();
    
    if (bodyEntry instanceof SOAPFault) {
    FAULT = (SOAPFault) bodyEntry;
    break;
    }
    }
    } catch (Exception e) {
    throw new ServiceException(e.getMessage());
    }
    
    IData Fault = IDataFactory.create();
    IDataCursor FaultCursor = Fault.getCursor();
    IDataUtil.put(FaultCursor, "FaultCode", FAULT.getFaultCode());
    IDataUtil.put(FaultCursor, "Reasons", new String[] { FAULT.getFaultString() });
    FaultCursor.destroy();
    
    IDataCursor outputCursor = pipeline.getCursor();
    IDataUtil.put(outputCursor, "Fault", Fault);
    outputCursor.destroy();

    Tho I’m opened to more elegant solutions also.

    Thanks for the tips!

    Best Regards,
    Jozsef


    #Integration-Server-and-ESB
    #webMethods-General
    #webMethods