ServiceConstructionException può verificarsi in varie fasi quando cxf confronta il servizio fornito, la porta e il nome del binding con il wsdl che ha già analizzato. In questo caso (e nella maggior parte dei casi) sembra essere un problema di namespace.
{http://sendmessage/}SendMessage
non è presente in wsdl analizzato o il nome del servizio non corrisponde a QName presente nel WSDL. Esistono anche altri casi in cui il binding o la porta non corrispondono, si potrebbe ricevere la stessa eccezione. Di seguito è riportato uno snippit di codice dal metodo org.apache.cxf.wsdl11.WSDLServiceFactory.create()
in cui tutto avviene.
Se le cose non sono chiare perché esattamente sta accadendo la soluzione migliore è quella di eseguire il debug di questo pezzo di codice e vedere dove si sta venendo a mancare e che cosa c'è nel analizzata definizione wDSL (com.ibm.wsdl.DefinitionImpl
in wsdl4j.jar).
javax.wsdl.Service wsdlService = definition.getService(serviceName);
if (wsdlService == null) {
if ((!PartialWSDLProcessor.isServiceExisted(definition, serviceName))
&& (!PartialWSDLProcessor.isBindingExisted(definition, serviceName))
&& (PartialWSDLProcessor.isPortTypeExisted(definition, serviceName))) {
try {
Map<QName, PortType> portTypes = CastUtils.cast(definition.getPortTypes());
String existPortName = null;
PortType portType = null;
for (QName existPortQName : portTypes.keySet()) {
existPortName = existPortQName.getLocalPart();
if (serviceName.getLocalPart().contains(existPortName)) {
portType = portTypes.get(existPortQName);
break;
}
}
WSDLFactory factory = WSDLFactory.newInstance();
ExtensionRegistry extReg = factory.newPopulatedExtensionRegistry();
Binding binding = PartialWSDLProcessor.doAppendBinding(definition,
existPortName, portType, extReg);
definition.addBinding(binding);
wsdlService = PartialWSDLProcessor.doAppendService(definition,
existPortName, extReg, binding);
definition.addService(wsdlService);
} catch (Exception e) {
throw new ServiceConstructionException(new Message("NO_SUCH_SERVICE_EXC", LOG, serviceName));
}
} else {
throw new ServiceConstructionException(new Message("NO_SUCH_SERVICE_EXC", LOG, serviceName));
}
PS: So che questo problema è stato aperto nel 2011, ma di recente ho affrontato lo stesso problema ed è stato in grado di risolverlo. Spero che aiuti gli altri che stanno affrontando questo problema.
fonte
2016-11-28 08:42:53
Ecco una domanda correlata. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –