Wyjątek ServiceConstructionException może wystąpić na różnych etapach, gdy cxf porównuje podaną usługę, port i nazwę powiązania z wsdl, który został już przeanalizowany. W tym przypadku (iw większości przypadków) wygląda na problem z przestrzenią nazw.
{http://sendmessage/}SendMessage
nie jest obecny w analizowanym pliku wsdl lub nazwa usługi nie jest zgodna z QName występującym w pliku WSDL. Istnieją również inne przypadki, w których powiązanie lub port nie są zgodne, jeden może otrzymać ten sam wyjątek. Poniżej znajduje się snippit kodu z metody org.apache.cxf.wsdl11.WSDLServiceFactory.create()
, gdzie wszystko się dzieje.
Jeśli nie jest jasne, dlaczego tak się dzieje, najlepszym rozwiązaniem jest debugowanie tego fragmentu kodu i zobaczenie, gdzie się ono nie udaje i co jest w analizowanej definicji wdsl (com.ibm.wsdl.DefinitionImpl
w pliku 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: Wiem, że ten problem został otwarty z powrotem w 2011 roku, ale niedawno w obliczu tego samego problemu i był w stanie go rozwiązać. Mam nadzieję, że pomoże to innym osobom, które mają do czynienia z tym problemem.
Oto powiązane pytanie. http://stackoverflow.com/questions/3006185/cxf-client-webservice-question –