ServiceConstructionException может возникать на разных этапах, когда cxf сравнивает предоставленный сервис, порт и имя привязки с wsdl, который он уже проанализировал.В этом случае (и в большинстве случаев) это выглядит как проблема пространства имен.
{http://sendmessage/}SendMessage
либо отсутствует в разобранном wsdl, либо имя службы не совпадает с QName , присутствующим в WSDL.Есть и другие случаи, когда привязка или порт не совпадают, можно получить такое же исключение.Ниже приведен фрагмент кода из метода org.apache.cxf.wsdl11.WSDLServiceFactory.create()
, где все это происходит.
Если неясно, почему именно это происходит, лучше всего отладить этот фрагмент кода и посмотреть, где он выходит из строя и чтотам в разобранном определении wdsl (com.ibm.wsdl.DefinitionImpl
в 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: я знаю, что эта проблема была открыта еще в 2011 году, но недавно я столкнулся с той же проблемой и смог ее решить.Я надеюсь, что это поможет другим, кто сталкивается с этой проблемой.