У меня есть простое приложение с веб-сервисом, созданным с помощью Apache CXF
. Это приложение работает, когда я запускаю сервер и клиент (как Java
приложения). Когда я пытаюсь получить доступ к URL приложения /services
, который отображается в web.xml
, Tomcat
дает мне 404
ошибку. Когда я запускаю проект, я получаю:
org.apache.cxf.service.factory.ServiceConstructionException: не удалось найти определение для службы {http://sendmessage/} SendMessage
Если у кого-нибудь есть намеки, связанные с этой ошибкой, я был бы рад их услышать. (Я искал google и не мог найти что-то, что было связано с моей ситуацией)
Спасибо!
Ответ 1
У меня была такая же ошибка, моя была связана с пространством имен, которые были разными в wsdl и webservice. Поэтому я изменил их на то же.
WSDL:
<wsdl:definitions name=""
targetNamespace="http://www.example.org/yourservice/"
Класс Webservice:
@WebService(targetNamespace = "http://www.example.org/yourservice/",
.........
Ответ 2
Даже у меня была аналогичная проблема.
Исправлено, обновив jaxws: конечную точку.
Я добавил serviceName (сопоставление с именем, присутствующим в файле WSDL) с пространством имен, определенным в "targetNamespace", определенном в теге wsdl: определения.
<jaxws:endpoint id=".." implementor="..." serviceName="s:SERVICE_NAME_IN_WSDL"
xmlns:s="TARGET_NAME_SPACE_WSDL_DEFINTIONS"></jaxws:endpoint>
отредактировано (06Jul)
Кроме того, у меня есть сегодня, что с версией Apache CXF 3.0.5 эта проблема не наступает;
Но с версией Apache CXF 3.1 это произойдет.
Ответ 3
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 году, но недавно я столкнулся с той же проблемой и смог ее решить. Я надеюсь, что это поможет другим, кто сталкивается с этой проблемой.