ServiceConstructionException kann in verschiedenen Phasen auftreten, wenn cxf den angegebenen Service-, Port- und Bindungsnamen mit der bereits analysierten WSDL vergleicht. In diesem Fall (und in den meisten Fällen) scheint es sich um ein Namespace-Problem zu handeln.
{http://sendmessage/}SendMessage
ist entweder nicht in geparsten WSDL vorhanden oder der Dienstname stimmt nicht mit der QName in der WSDL überein. Es gibt auch andere Fälle, in denen die Bindung oder der Port nicht zusammenpassen, und die gleiche Ausnahme erhalten könnte. Im Folgenden ist ein Code-Snippit von org.apache.cxf.wsdl11.WSDLServiceFactory.create()
Methode, wo alles passiert.
Wenn die Dinge nicht klar sind, warum genau passiert ist, ist die beste Wette, dieses Stück Code zu debuggen und zu sehen, wo es scheitert und was es in geparsten WDSL-Definition (com.ibm.wsdl.DefinitionImpl
in wsdl4j.jar) gibt.
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: Ich weiß, dass dieses Thema im Jahr 2011 wieder eröffnet wurde aber vor kurzem stand ich das gleiche Problem und konnte es lösen. Ich hoffe, es hilft anderen, die mit diesem Problem konfrontiert sind.
Hier ist eine verwandte Frage. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –