The problem can be generalized as: Maintenance issues with auto generated stubs & skeletons in webservices (particularly when request needs to be generated dynamically based on account types).
As Pershing already exposed an openAccount webservice we can generate stubs & skeletons etc and generate the request & response. In this module we have to dynamically generate requests based on the account types. In order to do this we have to actually maintain the mapping at two places one is at the business level i.e. field mapping between personal capital in personal cap& other one is at database level so, the server code can access it & use it in generating dynamic requests. This may lead to inconsistencies between the mappings business maintains & the code base server team maintains. Also just to maintain the code base is really difficult as the openAccount webservice contains so many properties to be set based on the account type.
To solve this we created the templates required as String based templates (xml format) & values to be populated are dynamically constructed from the excel file maintained by the business (So, always the source of truth is the excel file maintained by the Business). We construct the request based on the account type and invoke openaccount webservice endpoint url without considering the stubs & skeletons that are auto generated as shown below. This resulted in less maintenance in code and also made only 1 place to maintain the mappings which resulted in avoiding in consistencies.
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection con = scf.createConnection();
// Create a message factory.
MessageFactory mf = MessageFactory.newInstance();
// Create a message from the message factory.
SOAPMessage soapMsg = mf.createMessage();
// Create objects for the message parts
SOAPPart soapPart = soapMsg.getSOAPPart();
StreamSource msgSrc = new StreamSource(new StringReader(inputSoapMsg));
// Save the message
URLEndpoint urlEndpoint = new URLEndpoint(this.getPershingEndPoint());
reply = con.call(soapMsg, urlEndpoint);
if (reply != null)
ByteArrayOutputStream out = new ByteArrayOutputStream();
if (out != null)
output = out.toString();
logger.info(“The Response message is:” + output);