ServiceConstructionException puede ocurrir en varias etapas cuando cxf compara el servicio proporcionado, el puerto y el nombre de enlace con el wsdl que ya ha analizado. En este caso (y en la mayoría de los casos) parece ser un problema de espacio de nombres.
{http://sendmessage/}SendMessage
no está presente en el archivo wsdl analizado o el nombre del servicio no coincide con el QName presente en el WSDL. También hay otros casos en los que el enlace o el puerto no coinciden, uno podría recibir la misma excepción. Lo que sigue es un snippit de código del método org.apache.cxf.wsdl11.WSDLServiceFactory.create()
donde sucede todo.
Si no está claro por qué sucede exactamente, lo mejor es depurar este fragmento de código y ver dónde está fallando y qué hay en la definición wdsl analizada (com.ibm.wsdl.DefinitionImpl
en 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));
}
PD: Sé que este tema se abrió de nuevo en 2011 pero recientemente se enfrentó al mismo problema y fue capaz de resolverlo. Espero que ayude a otros que se enfrentan a este problema.
Aquí hay una pregunta relacionada. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –