Apache CXF
で作成されたWebサービスを備えた単純なアプリケーションがあります。このアプリケーションは、サーバーとクライアントを(Java
アプリケーションとして)実行すると機能します。 /services
にマップされているアプリケーションweb.xml
URLにアクセスしようとすると、Tomcat
で404
エラーが発生します。私が受け取るプロジェクトを実行すると、次のようになります。
org.Apache.cxf.service.factory.ServiceConstructionException:サービスの定義が見つかりませんでした{http:// sendmessage /} SendMessage
誰かがこのエラーに関連するヒントを持っているなら、私はそれらを聞いてうれしいです。 (私はグーグルを検索しましたが、私の状況に関連するものを見つけることができませんでした)
ありがとうございました!
私は同じエラーを抱えていました、私のものはwsdlとwebserviceで異なる名前空間に関連していました。だから私はそれらを同じに変更しました。
WSDL:
<wsdl:definitions name=""
targetNamespace="http://www.example.org/yourservice/"
Webサービスクラス:
@WebService(targetNamespace = "http://www.example.org/yourservice/",
.........
私も同様の問題を抱えていました。 jaxws:endpointを更新して修正しました。 wsdl:definitionsタグで定義された「targetNamespace」で定義された名前空間でserviceName(WSDLファイルに存在する名前にマッピング)を追加しました。
<jaxws:endpoint id=".." implementor="..." serviceName="s:SERVICE_NAME_IN_WSDL"
xmlns:s="TARGET_NAME_SPACE_WSDL_DEFINTIONS"></jaxws:endpoint>
編集(7月6日)
また、Apache CXF 3.0.5バージョンでは、この問題は発生しません。しかし、Apache CXF 3.1バージョンでは、これが実現します。
ServiceConstructionExceptionは、cxfが提供されたサービス、ポート、およびバインディング名を、すでに解析済みのwsdlと比較するときに、さまざまな段階で発生する可能性があります。この場合(そしてほとんどの場合)、名前空間の問題のようです。
_{http://sendmessage/}SendMessage
_が解析されたwsdlに存在しないか、サービス名がWSDLに存在する QName と一致しません。バインディングまたはポートが一致しない場合もあり、同じ例外が発生する可能性があります。以下は、すべてが発生するorg.Apache.cxf.wsdl11.WSDLServiceFactory.create()
メソッドからのコードスニペットです。
正確に発生している理由が明確でない場合は、このコードをデバッグして、失敗している場所と、解析されたwdsl定義(wsdl4j.jarの_com.ibm.wsdl.DefinitionImpl
_)に何があるかを確認することをお勧めします。
_ 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年に開かれたことは知っていますが、最近同じ問題に直面し、解決することができました。この問題に直面している他の人の助けになることを願っています。
Caused by: org.Apache.cxf.service.factory.ServiceConstructionException: Could not find definition for port {http://localhost:9990/project/wsdl/targetName}targetNameSoap12.
at org.Apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.Java:179)
at org.Apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.Java:428)
at org.Apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.Java:548)
at org.Apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.Java:265)
at org.Apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.Java:215)
at org.Apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.Java:102)
at org.Apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.Java:159)
at org.Apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.Java:211)
at org.Apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.Java:456)
at org.Apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.Java:334)
... 13 more
問題を修正しました。WebサービスインターフェイスとコントラクトWSDLのアノテーション@WebService(targetNameSpace = "targetNameSoap12")で定義します。
例の場合:
...
<wsdl:service name='targetName'>
<wsdl:port binding='tns:targetNameSoap12' name='targetNameSoap12'>
...