2011-06-16 74 views
1

我想從axis遷移到cxf,並且我有插件生成的java代碼的wsdl文件。我有2個問題:從axis遷移到cxf

  1. 我在WSDL文件中的下列塊:

    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    和任何URI生成到字符串而不是URI,沒有人知道爲什麼嗎?

  2. 該軸創建服務定位器類和綁定存根類,它允許添加到Web服務屬性,如用戶名,密碼,超時等。我需要添加此屬性,因爲服務是通過安全連接,它們是不是web服務生成方法sendSms中的參數。 (你可以看到下面的定義)。

    <wsdl:portType name="SendSms"> 
        <wsdl:operation name="sendSms"> 
        <wsdl:input message="parlayx_sms_send:SendSms_sendSmsRequest"/> 
        <wsdl:output message="parlayx_sms_send:SendSms_sendSmsResponse"/> 
        <wsdl:fault message="parlayx_common_faults:ServiceException" name="ServiceException"/> 
        <wsdl:fault message="parlayx_common_faults:PolicyException" name="PolicyException"/> 
        </wsdl:operation> 
    </wsdl:portType> 
    
    <xsd:element name="sendSms" type="parlayx_sms_send_local_xsd:sendSms"/> 
        <xsd:complexType name="sendSms"> 
        <xsd:sequence> 
         <xsd:element maxOccurs="unbounded" minOccurs="1" name="addresses" type="xsd:anyURI"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="senderName" type="xsd:string"/> 
         <xsd:element name="message" type="xsd:string"/> 
         <xsd:element maxOccurs="1" minOccurs="0" name="receiptRequest" type="parlayx_common_xsd:SimpleReference"/> 
        </xsd:sequence> 
        </xsd:complexType> 
    

    我沒有發現,我敢肯定它表明我如何添加這些值的任何實例。 你知道這樣的例子嗎?

感謝, 丹妮拉

回答

0

關於你的第一個問題,CXF使用JAXB(默認)做XML和對象之間的轉換,並指定anyURI映射到String。如果您希望在無效URI上檢查異常,則必須使用new URI(str)自己執行轉換;如果您希望檢查未經檢查的異常,則必須使用URI.create(str)。雖然你可以註冊一個自定義轉換器來爲你處理,但在我看來,它比自己做得複雜得多;每個URI參數有一行額外的代碼(或者如果使用檢查的異常路由,可能會有幾行代碼,這可能在形式上更好)。

關於第二個問題,關鍵是通過CXF(或任何其他JAX-WS兼容的客戶端)生成的客戶端存根實現javax.xml.ws.BindingProvider接口。這將導致代碼有點像這樣:

// Use the right things from your tooling here... 
SendSMS serviceInstance = new SMSSender().getSendSMSImplPort(); 

Map<String, Object> requestContext = 
     ((BindingProvider) serviceInstance).getRequestContext(); 
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceAddress); 
requestContext.put(BindingProvider.USERNAME_PROPERTY, username); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
// And so on for all the properties you want to configure 

超時有點不同,因爲在CXF他們configured at the conduit level。相關一塊線程的似乎是這樣的片段(其所屬的cxf.xml文件中):

<http:conduit name="http://131.107.153.205/.*"> 
    <http:client ConnectionTimeout="0" ReceiveTimeout="0"/> 
</http:conduit> 

我不知道究竟你會如何改變,以適應您的需求(尤其是管道名稱);這是我迄今爲止一直堅持默認設置的地方。 (您可能能夠set it at the code level - 請參閱評論 - 但對此我不太清楚。)另請注意,在上述情況下,兩個超時由該代碼設置爲根本沒有超時;這可能不是你想要的生產代碼...

+0

感謝。 關於第二個答案,我不太確定如何找到綁定界面。我有一個接口SendSms與定義的方法和一個SendSmsService,從它我可以做getSendSms並接收接口。 – Daniela 2011-06-16 12:02:50

0

是的,CXF使用JAXB(默認情況下)在XML和對象之間進行轉換,並指定anyURI映射到一個字符串。但是,可以更改Java類型和SOAP類型之間的綁定。下面是JAXB綁定文件,它映射到xs:anyURIjava.net.URI

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

     <jaxb:globalBindings 
      xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <jaxb:javaType name="java.net.URI" xmlType="xs:anyURI" 
       parseMethod="create" printMethod="toASCIIString" /> 
     </jaxb:globalBindings> 
</jaxb:bindings> 

要考慮到這一點使用給予選項-bwsdl2java,指定JAXWS或JAXB綁定文件

wsdl2java -b type-bindings.xml ...