2013-04-08 75 views
0

我已經通過HTTP出站使用CXF JAXWS服務公開了Web服務。運行CXF JAX WS服務的問題

下面給出了我的Mule配置中的終點聲明的語法。

<http:inbound-endpoint address="http://localhost:8080/HelloService" exchange-pattern="request-response"> 
     <cxf:jaxws-service serviceClass="com.example.service.HelloServiceImpl" wsdlLocation="wsdl/helloservice.wsdl" 
     namespace="http://example.org/HelloService"   
     port="HelloServicePort" service="HelloService" > 

但是這是行不通的。 當試圖在mule服務器上運行時,它會給出下面的錯誤。

2013-04-08 16:34:35,252 ERROR [main] mule.MuleServer (MuleServer.java:474) - 
******************************************************************************** 
* A Fatal error has occurred while the server was running:      * 
* Could not find definition for port           * 
* {http://service.example.com/}HelloServiceImplPort.    * 
* (org.apache.cxf.service.factory.ServiceConstructionException)    * 
*                    * 
* The error is fatal, the system will shutdown         * 
******************************************************************************** 

它正在尋找與我在服務端點聲明中提到的端口不同的端口。

請幫我理解,問題是什麼。

以下給出的是該服務的wsdl。

我已經創建了這個WSDL,然後使用cfx的wsdl2java生成代碼。 然後執行服務接口操作。 然後在Mule流中配置服務。

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://example.org/HelloService" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
name="HelloService" targetNamespace="http://example.org/HelloService" 
xmlns:per="http://example.org/HelloService/person" 
xmlns:comp="http://example.org/HelloService/company" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 

    <wsdl:types>   
    <xsd:schema targetNamespace="http://example.org/HelloService/company" >  
     <xsd:include schemaLocation="company.xsd" ></xsd:include>  
    </xsd:schema> 
    <xsd:schema targetNamespace="http://example.org/HelloService/person"> 
     <xsd:include schemaLocation="person.xsd" ></xsd:include>  
    </xsd:schema> 
    </wsdl:types> 


    <wsdl:message name="addCompanyRequest"> 
    <wsdl:part element="comp:Company" name="company"/> 
    </wsdl:message> 

    <wsdl:message name="addPersonRequest"> 
    <wsdl:part element="per:Person" name="person"/> 
    </wsdl:message> 

    <wsdl:message name="addCompanyResponse"> 
    <wsdl:part element="comp:CompResponse" name="response"/> 
    </wsdl:message> 

    <wsdl:message name="addPersonResponse"> 
    <wsdl:part element="per:PerResponse" name="response"/> 
    </wsdl:message> 

    <wsdl:portType name="HelloService"> 
    <wsdl:operation name="addCompany"> 
     <wsdl:input message="tns:addCompanyRequest" name="addCompanyRequest" /> 
     <wsdl:output message="tns:addCompanyResponse" name="addCompanyResponse" /> 
    </wsdl:operation> 

    <wsdl:operation name="addPerson"> 
     <wsdl:input message="tns:addPersonRequest" name="addPersonRequest" /> 
     <wsdl:output message="tns:addPersonResponse" name="addPersonResponse" /> 
    </wsdl:operation> 

    </wsdl:portType> 

    <wsdl:binding name="HelloServiceSOAP" type="tns:HelloService"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="addCompany"> 
     <soap:operation soapAction="" style="document" /> 
     <wsdl:input name="addCompanyRequest"> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="addCompanyResponse"> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 

    <wsdl:operation name="addPerson"> 
     <soap:operation soapAction="" style="document" /> 
     <wsdl:input name="addPersonRequest"> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="addPersonResponse"> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 

    </wsdl:binding> 

    <wsdl:service name="HelloService"> 
    <wsdl:port binding="tns:HelloServiceSOAP" name="HelloServicePort"> 
     <soap:address location="http://localhost:8080/HelloService"/> 
    </wsdl:port> 
    </wsdl:service> 

</wsdl:definitions> 

回答

4

我絕對沒有問題了port屬性配置cxf:jaxws-service,所以我認爲這個問題是在你的配置。

例如,錯誤表示CXF正在尋找{http://service.example.com}HelloServiceImplPort,但令人驚訝的是,您將服務名稱空間配置爲http://example.org/HelloService。雖然它不需要一致,但它通常是。

看着你的WSDL,事情看起來是正確的,所以我的猜測是HelloServiceImpl.class上的@WebService註釋包含時髦的值。

它應該是:

@WebService(endpointInterface = "...interface class...", targetNamespace = "http://example.org/HelloService", serviceName = "HelloService", portName = "HelloServicePort", wsdlLocation = "wsdl/helloservice.wsdl") 

需要注意的是有正確地配置@WebService,你只需要這騾子XML配置:

<cxf:jaxws-service serviceClass="com.example.service.HelloServiceImpl" /> 
+1

服務的名稱空間爲http://example.org/HelloService服務的實現類位於com.example.service包中,其中包含t他的類名稱爲HelloServiceImpl。我想這就是它正在尋找名稱爲HelloServiceImplPort且名稱空間爲{http://service.example.com}的端口的原因。但是我已經使用namespace屬性指定了命名空間,並且在mule配置中也提到了wsdl中的端口名稱。 – user1760178 2013-04-09 13:22:36

+0

我已將我的wsdl添加到該問題。 – user1760178 2013-04-09 13:22:57

+0

我明白了。它是我的impl類中的@WebService註釋的問題。非常感謝David Dassot。 – user1760178 2013-04-09 19:10:56

0

是不是<cxf:jaxws-service serviceClass="interface-name and not implementation name>在本example

引用