jax_ws

接口定義:

@WebService(name = "UserService",targetNamespace = Constants.WS_NAMESPACE) public interface UserWebService { @WebResult(name = "user"public UserDTO getUser(@WebParam(name = "userId") Integer userId) throws FaultException;}
  • @WebService 必須,(name="UserService")可選,配置Service的名稱,默認爲類名。targetNamespace可選,默認爲http:// package的倒序,可在一個自己的Constants裏定義統一的namespace.
  • 默認接口的所有方法均輸出爲WebService。
  • @WebResult 可選,配置方法的返回值在WSDL的名稱,CXF默認爲result。
  • @WebParam 可選,配置參數在WSDL的名稱,CX比較笨F默認爲arg0,arg1....
  • @WebMethod 可選,有一個方法有此註釋,則其他無註釋的方法非WebService。

接口實現:

@WebService(endpointInterface = "org.springside.examples.miniservice.ws.user.UserWebService",targetNamespace = Constants.WS_NAMESPACE)public class UserWebServiceImpl
  • @WebService(endpointInterface="")  必須,指定實現的接口。

小結:

    接口與實現類都需要@WebService(targetNamespace = Constants.WS_NAMESPACE),接口還需要屬性name,實現需要屬性endpointInterface。

    針對笨笨,不會自動反射參數名的CXF,每個方法的參數都需要重新標註。

三、JAXB2.0入門

@XmlType(name = "User")public class UserDTO {}
  • JAXB的智能化較高,基本上不需要手工映射。 
  • 默認的@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER )根據公共getter/setter與公共屬性反射(XmlAccessType.PROPERTY根據getter/setter反射,XmlAccessType.FIELD 根據成員變量反射)
  • 如果有需要註釋@XMLElement,@XMLAttribute,需配合XmlAccessorType定義,默認的PUBLIC_MEMBER,需要在getter/setter上定義,如果要寫在成員變量上定義,則XmlAccessType改爲FIELD。
  • @XmlType(name = "User") 指定WSDL上的類型名稱。
  • @XmlTransient 可以註釋某個字段,取消該字段的反射。

四、直接處理原始XML請求的Provider接口

JAX-WS的API有兩個層次,除了常見DataBinding後調用最終Java方法外,還可以使用客戶端的Dispatch與服務端Provider接口,繞過DataBinding處理,直接處理XML。

JAX-WS新增的這個功能是爲複雜Web服務貼身訂造的。被繞過的DataBinding,可以自行調用JAXB2.0的api完成。至於WSDL,可以寫死,也可以在一個serverlet裏用wsdl4j動態編寫。

在Spring配置文件裏,將implementor指向你的Provider,指定WSDL,然後編寫Provider<T>實現invoke(T)函數。

@WebServiceProvider(portName="stockQuoteReporterPort" serviceName="stockQuoteReporter")@ServiceMode(value="Service.Mode.PAYLOAD")public class  stockQuoteReporterProvider implements Provider<DOMSource>public stockQuoteReporterProvider(){  }public DOMSource invoke(DOMSource request){    DOMSource response = new DOMSource();    ...    return response;  }}

這裏ServiceMode有兩種模式,PAYLOAD(soap-body)或MESSAGE(完整soap信息)

又見範型,<DOMSource>指明瞭數據的類型,可選DOM/SAX/StreamSource。也可以是Service.Mode.MESSAGE下的完整SOAPMessage或JMS的DataSource。

最後,需要自行拼裝返回的XML結果,記得那些NameSpace不要錯。

五,利用Cookie保持session

     IE會自行處理cookie,而WebService的客戶端,就需要如下代碼記錄Cookie並在下一次請求時發送。

BindingProvider bp = (BindingProvider)port;bp.getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);

   CXF和Metro裏面都是這麼段代碼,BindingProvider是JAX-WS中的類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章