web-dev-qa-db-ja.com

ServiceConstructionExceptionを解決する方法:サービスの定義が見つかりませんでしたか?

Apache CXFで作成されたWebサービスを備えた単純なアプリケーションがあります。このアプリケーションは、サーバーとクライアントを(Javaアプリケーションとして)実行すると機能します。 /servicesにマップされているアプリケーションweb.xml URLにアクセスしようとすると、Tomcat404エラーが発生します。私が受け取るプロジェクトを実行すると、次のようになります。

org.Apache.cxf.service.factory.ServiceConstructionException:サービスの定義が見つかりませんでした{http:// sendmessage /} SendMessage

誰かがこのエラーに関連するヒントを持っているなら、私はそれらを聞いてうれしいです。 (私はグーグルを検索しましたが、私の状況に関連するものを見つけることができませんでした)

ありがとうございました!

11
ariel_ro

私は同じエラーを抱えていました、私のものはwsdlとwebserviceで異なる名前空間に関連していました。だから私はそれらを同じに変更しました。

WSDL:

<wsdl:definitions name=""
    targetNamespace="http://www.example.org/yourservice/"

Webサービスクラス:

@WebService(targetNamespace = "http://www.example.org/yourservice/",
.........
10
TastyCode

私も同様の問題を抱えていました。 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バージョンでは、これが実現します。

3
S R Chaitanya

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年に開かれたことは知っていますが、最近同じ問題に直面し、解決することができました。この問題に直面している他の人の助けになることを願っています。

1
Rajeev Singh
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'>
...
0
jardel.marden