I am new to the SOAP world.
I have coverted the wsdl
file to java
class using maven plugin
Below is the pom.xml configuration.
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.1.12</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.basedir}/src/main/java</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${project.basedir}/src/main/resources/EIAproxy.wsdl</wsdl> <wsdlLocation>classpath:EIAproxy.wsdl</wsdlLocation> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>
below is the class files
Interface definition
@WebService(targetNamespace = "http://schema.concierge.com", name = "EaiEnvelopeSoap") @XmlSeeAlso({com.concierge.schema.envelope.ObjectFactory.class, ObjectFactory.class}) @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public interface EaiEnvelopeSoap { @WebResult(name = "clientRequestResponse", targetNamespace = "http://schema.concierge.com", partName = "parameters") @WebMethod(action = "http://www.openuri.org/clientRequest") public ClientRequestResponse clientRequest( @WebParam(partName = "parameters", name = "clientRequest", targetNamespace = "http://schema.concierge.com") ClientRequest parameters ); }
Here is class file that extends service
@WebServiceClient(name = "EaiEnvelope", wsdlLocation = "classpath:EIAproxy.wsdl", targetNamespace = "http://schema.concierge.com") public class EaiEnvelope extends Service { public final static URL WSDL_LOCATION; public final static QName SERVICE = new QName("http://schema.concierge.com", "EaiEnvelope"); public final static QName EaiEnvelopeSoap = new QName("http://schema.concierge.com", "EaiEnvelopeSoap"); static { URL url = EaiEnvelope.class.getClassLoader().getResource("EIAproxy.wsdl"); if (url == null) { java.util.logging.Logger.getLogger(EaiEnvelope.class.getName()) .log(java.util.logging.Level.INFO, "Can not initialize the default wsdl from {0}", "classpath:EIAproxy.wsdl"); } WSDL_LOCATION = url; } public EaiEnvelope(URL wsdlLocation) { super(wsdlLocation, SERVICE); } public EaiEnvelope(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } public EaiEnvelope() { super(WSDL_LOCATION, SERVICE); } public EaiEnvelope(WebServiceFeature ... features) { super(WSDL_LOCATION, SERVICE, features); } public EaiEnvelope(URL wsdlLocation, WebServiceFeature ... features) { super(wsdlLocation, SERVICE, features); } public EaiEnvelope(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) { super(wsdlLocation, serviceName, features); } /** * * @return * returns EaiEnvelopeSoap */ @WebEndpoint(name = "EaiEnvelopeSoap") public EaiEnvelopeSoap getEaiEnvelopeSoap() { return super.getPort(EaiEnvelopeSoap, EaiEnvelopeSoap.class); } /** * * @param features * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values. * @return * returns EaiEnvelopeSoap */ @WebEndpoint(name = "EaiEnvelopeSoap") public EaiEnvelopeSoap getEaiEnvelopeSoap(WebServiceFeature... features) { return super.getPort(EaiEnvelopeSoap, EaiEnvelopeSoap.class, features); } }
My SoapHandler file is
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import com.xxx.fdp.common.LoggerManager; import com.xxx.fdp.constants.LoggerConstantEnum; import com.xxx.fdp.property.config.AbilityConfig; public class HeaderHandler implements SOAPHandler<SOAPMessageContext> { /** The logger manager. */ LoggerManager loggerManager = new LoggerManager(); @Override public boolean handleMessage(SOAPMessageContext smc) { Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Entered in handleMessage with outBoundProperty : " + outboundProperty); if (outboundProperty.booleanValue()) { SOAPMessage message = smc.getMessage(); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, " Message : " + message); try { message.writeTo(System.out); SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); envelope.addNamespaceDeclaration("com", "http://schema.concierge.com"); message.getMimeHeaders().setHeader("Content-Type", "application/soap+xml; charset=utf-8"); SOAPHeader header = envelope.addHeader(); SOAPElement authentication = header.addChildElement("authentication", "auth", "http://schemas.eia.org/middleware/AuthInfo"); SOAPElement username = authentication.addChildElement("user", "auth"); username.addTextNode(AbilityConfig.getInstance().getSoapUser()); SOAPElement password = authentication.addChildElement("password", "auth"); password.addTextNode(AbilityConfig.getInstance().getSoapPassword()); SOAPElement authType = authentication.addChildElement("type", "auth"); authType.addTextNode(AbilityConfig.getInstance().getSoapAuthType()); SOAPBody body = envelope.getBody(); // Print out the outbound SOAP message to System.out message.saveChanges(); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Request Format : " + envelope.getBody() + ",Header : " + envelope.getHeader()); ByteArrayOutputStream out = new ByteArrayOutputStream(); message.writeTo(out); String strMsg = new String(out.toByteArray()); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Request Format Message: " + strMsg); StringWriter writer = new StringWriter(); message.writeTo(new StringOutputStream(writer)); // message.writeTo(System.out); System.out.println(""); } catch (Exception e) { e.printStackTrace(); } } else { try { // This handler does nothing with the response from the Web // Service so // we just print out the SOAP message. SOAPMessage message = smc.getMessage(); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Response Message : " + message); message.writeTo(System.out); System.out.println(""); } catch (Exception ex) { ex.printStackTrace(); } } loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Exit in handleMessage with outBoundProperty : " + outboundProperty); return outboundProperty; } private static class StringOutputStream extends OutputStream { private StringWriter writer; public StringOutputStream(StringWriter writer) { this.writer = writer; } @Override public void write(int b) throws IOException { writer.write(b); } } @Override public boolean handleFault(SOAPMessageContext context) { loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Entered in handleFault "); return false; } @Override public void close(MessageContext context) { loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "Entered in close "); } @Override public Set<QName> getHeaders() { // TODO Auto-generated method stub return null; } }
My handlerResolver file is
import java.util.ArrayList; import java.util.List; import javax.xml.ws.handler.Handler; import javax.xml.ws.handler.HandlerResolver; import javax.xml.ws.handler.PortInfo; import com.xxx.fdp.common.LoggerManager; import com.xxx.fdp.constants.LoggerConstantEnum; public class HeaderHandlerResolver implements HandlerResolver { LoggerManager loggerManager = new LoggerManager(); @SuppressWarnings("rawtypes") @Override public List<Handler> getHandlerChain(PortInfo portInfo) { loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"Entered in getHandlerChain"); List<Handler> handlerChain = new ArrayList<Handler>(); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"Created handlerChanin object"); HeaderHandler headerHandler = new HeaderHandler(); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"Created HeaderHandler object"); handlerChain.add(headerHandler); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"returned handlerChain"); return handlerChain; } }
Method which is used to call service
public void processRequest(EaiEnvelope envelope,AbilitySyncUpData abilityObject) { loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "| processing ability async up starts with TranactionId : "+abilityObject.getTransactionId()); try { com.concierge.schema.EaiEnvelope service=new com.concierge.schema.EaiEnvelope(); HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver(); service.setHandlerResolver(handlerResolver); EaiEnvelopeSoap port=service.getEaiEnvelopeSoap(); ClientRequest request=new ClientRequest(); request.setEaiEnvelope(envelope); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"Sending request to web service with TranactionId : "+abilityObject.getTransactionId()); ClientRequestResponse response=port.clientRequest(request); loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp,"Response received "+response+" After sending request to web service with TranactionId : "+abilityObject.getTransactionId()); } catch (Exception e) { loggerManager.error(LoggerConstantEnum.AbilityDailySyncUp, "| Exception occured : " + e.fillInStackTrace(), e); writeCsvFile(abilityObject); } loggerManager.info(LoggerConstantEnum.AbilityDailySyncUp, "| processRequest method ends here with TranactionId : "+abilityObject.getTransactionId());
I am not able to get call in soapHandler
's handleMessage
method and call is going on getHeadersmethod when the service method
ClientRequestResponse response=port.clientRequest(request);` is called.
I have reffered from several answers that are present on stackoverflow:
SoapHandler not called after WS operation is executed
https://stackoverflow.com/a/12712728/1569443
https://stackoverflow.com/a/14523921/1569443
http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client/
https://soa2world.blogspot.com/2009/05/direct-web-service-client-using-java.html
I am still not able to call handleMessage
method of handler as no logs gets printed. Call is made in handlerResolver
class but not in HeaderHandler
class.
How can I resolve this issue?
0 comments:
Post a Comment