{\rtf1\ansi\ansicpg1252 \deff0{\fonttbl{\f0\froman\fcharset0 Times New Roman;}{\f1\fswiss\fcharset0 Arial;}{\f2\froman\fcharset2 Symbol;}} {\colortbl\red0\green0\blue0;\red255\green255\blue255;\red255\green0\blue0;\red0\green0\blue255;} {\*\listtable {\list\listtemplateid756732221\hybrid {\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300} \listid1949666342} {\list\listtemplateid1884635386\hybrid {\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300} \listid1426575058} {\list\listtemplateid1221067129\hybrid {\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers \'01;}\fi0\li400\ri0\tx400} \listid1158921554} {\list\listtemplateid1120902271\hybrid {\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers \'01;}\fi0\li400\ri0\tx400} \listid108685479} {\list\listtemplateid1417608118\hybrid {\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f2\fi0\li300\ri0\tx300} \listid45024897} } {\*\listoverridetable {\listoverride\listid1949666342\listoverridecount0\ls1} {\listoverride\listid1426575058\listoverridecount0\ls2} {\listoverride\listid1158921554\listoverridecount0\ls3} {\listoverride\listid108685479\listoverridecount0\ls4} {\listoverride\listid45024897\listoverridecount0\ls5} } {\info{\operator iText by lowagie.com}{\creationdate \yr2022\mo2\dy7\hr7\min13\sec27}{\operator Doxia iText}{\creationdate \yr2022\mo2\dy7\hr7\min13\sec27}} \paperw11907\paperh16840\margl720\margr720\margt720\margb720 {\footer }{\header }\pgwsxn11907\pghsxn16840\sectd{\footer }{\header }\pgwsxn11907\pghsxn16840\pard\li0\ri0\f1\fs48\cf2 1. \f1\fs48\cf2 Bindings\par\par\pard\li0\ri0\f1\fs44\cf0 1.1. \f1\fs44\cf0 Bindings Overview \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Bindings are one of the most important pieces of XFire. They control how the incoming and outoing XML is mapped to objects. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The default binding in XFire is "Aegis". Aegis means "shield", and the point of it is to create a simple layer which makes going between objects and XML easy. Aegis also provides the layer which allows other bindings to integrate with XFire - like JAXB, XMLBeans and Castor. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Lets take a look at how you would use a different binding with XFire. The BindingProvider class is the one for actually taking the xml streams and reading/writing to them. When we create a service we need to actually supply a BindingProvider to the service. In the simplest case of creating a service you're probably writing code like this: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 ServiceFactory factory = new ObjectServiceFactory();\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 But, what this is actually doing in the constructor is creating an AegisBindingProvider: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 ServiceFactory factory = new ObjectServiceFactory(new AegisBindingProvider());\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.2. \f1\fs44\cf0 Using another binding \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This AegisBindingProvider has the concept of a TypeRegistry and TypeCreators (don't worry you don't need to know much about this), which create Type classes for you. Types serialize and deserialize java classes. When you use a different binding it actually provides a different TypeRegistry and TypeCreator for its types. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 So if you were to create a JAXB 2.0 binding you would do: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 import org.codehaus.xfire.aegis.AegisBindingProvider;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 ...\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 ServiceFactory factory = new ObjectServiceFactory(new AegisBindingProvider(new JaxbTypeRegistry()));\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Each binding has a different type registry: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Binding \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Type Registry \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Default POJOs \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.aegis.DefaultTypeMappingRegistry \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Castor \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.castor.CastorTypeMappingRegistry \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 JAXB 1.1 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.jaxb.JaxbTypeRegistry \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 JAXB 2.0 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.jaxb2.JaxbTypeRegistry \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 XMLBeans \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.xmlbeans.XmlBeansTypeRegistry \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 But don't stop here, you can use these BindingProviders with different ServiceFactorys. Here is an example using JAXB 2.0 and the annotation service factory. \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 import org.codehaus.xfire.aegis.AegisBindingProvider;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 ...\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 ServiceFactory factory = new AnnotationServiceFactory(new Jsr181WebAnnotations(),\f0\fs20\cf0 \par \f1\fs20\cf0 new AegisBindingProvider(new JaxbTypeRegistry()));\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.3. \f1\fs44\cf0 Convenience ServiceFactorys \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 If you just want to use the simple ObjectServiceFactory we have several convenience ServiceFactorys around: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Binding \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 Service Factory \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 JAXB 1.1 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.jaxb.JaxbServiceFactory \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 JAXB 2.0 \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.jaxb2.JaxbServiceFactory \cell \row \trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx5200\clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth5200 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\ql\li0\ri0\f1\fs20\cf0 XMLBeans \cell\pard\intbl\ql\li0\ri0\f1\fs20\cf0 org.codehaus.xfire.xmlbeans.XmlBeansServiceFactory \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You can use these just like you would an ObjectServiceFactory: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 import org.codehaus.xfire.jaxb2.JaxbServiceFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.service.ServiceFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 ...\f0\fs20\cf0 \par \f1\fs20\cf0 ServiceFactory factory = new JaxbServiceFactory();\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.4. \f1\fs44\cf0 The MessageBinding \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 There is also one other type of binding, the MessageBinding. The MessageBinding has special semantics to allow you to work with XML streams and fragments real easily. Read more on the Message Binding page. \par\par\pard\li0\ri0\f1\fs44\cf0 1.5. \f1\fs44\cf0 Aegis Binding \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Aegis is the default XFire binding which maps XML to POJOs. It supports code first development only at this point - i.e. you write your service in POJOs and it will generate the XML schema/wsdl for you. \par\par\pard\li0\ri0\f1\fs44\cf0 1.6. \f1\fs44\cf0 XML and Annotation Mapping Overview \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Aegis has a flexible mapping system so you can control how your beans are controlled. By default your POJOs are serialized based on their name and namespaces. If you have a class in the "org.codehaus.xfire" package named "Employee" it would be serialized in namespace "http://xfire.codehaus.org" with the local name "YourBean."\par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Fore example, the java class: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 public class Employee\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 private String name;\f0\fs20\cf0 \par \f1\fs20\cf0 private String title;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String getName() \u123? return name; \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 public void setName(String name) \u123? this.name = name; \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String getTitle() \u123? return title; \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 public void setTitle(String title) \u123? this.title = title; \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In XML this translates to: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 Santa Claus\f0\fs20\cf0 \par \f1\fs20\cf0 首席出席官 (CPO)\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In XML Schema this would become a complex type: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Note that is used to configure methods on your service and property is used to configure properties on your javabeans. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The above example highlights many of the possible elements, most are optional and the format encourages minimally specified mappings. \par\par\par\pard\li0\ri0\f1\fs44\cf0 1.7. \f1\fs44\cf0 Controlling Naming \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Lets pretend that in the above example you would like the elements names to be capatilized and in the namespace "urn:north-pole:operations". You could achieve this through a mapping file like so: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Notice that the namespace was declared on the mappings element and then the prefix was used to specify the element QNames for the name/title properties. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This will result in a mapping like so: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 Santa Claus\f0\fs20\cf0 \par \f1\fs20\cf0 Chief Present Officer (CPO)\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f1\fs40\cf0 1.7.1. \f1\fs40\cf0 Ignoring properties \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 If you don't want to serialize a certain property it is easy to ignore it: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 1.7.2. \f1\fs40\cf0 Handling Collections \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You undoubtedly use Collections in your code. Pre Java 5 it is impossible to determine the "component type" of a Collection by introspection. So you need to give Aegis some hints. For a service which returned a Collection of employees like so: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 public class EmployeeService\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 Collection getEmployees(String id) \u123? ... \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You would need to supply metadata which gave the component type in a mapping file like this one: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 1.7.3. \f1\fs40\cf0 Handling Maps \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Java Maps don't map well to XML Schema (no pun intended) because there is no Map concept in XML Schema so your clients. Maps are transformed to a collection of \pard\f1\fs24\cf0 key, value \f1\fs20\cf0 tuples instead. In addition to providing the type of the value, you must also provide Aegis with the type of the key: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 public class GiftService\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 Map getGiftList() \u123? /* returns a map of NiceChild => Present */ \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The mapping file should look like this: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This will generate the following type: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\par\par\pard\li0\ri0\f1\fs44\cf0 1.8. \f1\fs44\cf0 Interfaces and Aegis \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The Aegis binding will automatically create proxies for your interfaces when reading XML. So if you have an interface like this: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 public interface User \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 public String getUsername();\f0\fs20\cf0 \par \f1\fs20\cf0 public String getPasswrod();\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 It will then create its own implementation of User and provide a username and password from the XML. You can specify your implementation class (in 1.1+) by setting a property on your service: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 Service service = ...;\f0\fs20\cf0 \par \f1\fs20\cf0 service.setProperty("com.acme.User.implementation", "com.acme.UserImpl");\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 1.9. \f1\fs44\cf0 Castor \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Castor is a flexible XML binding tool that provides run-time marshalling and unmarshalling of XML and Java objects. One strength of Castor when compared to most (not all) other Java XML binding frameworks is that re-compilation of the Java code is not required if the mapping definition changes. Therefore, systems where the web service layer is being developed independently from the business layer can benefit from using Castor. XFire support for Castor is currently available in the latest XFire release. Two approaches to developing a Web service using Castor with XFire are presented below: top-down (schema first) and bottom-up (code first). Before proceeding, check the Dependency Guide for required castor module dependencies. \par\pard\li0\ri0\f1\fs40\cf0 1.9.1. \f1\fs40\cf0 Assumptions about Reader \par\par\f0\fs20\cf0 \par \f1\fs20\cf0 \pard\ql\fi0\li300\ri0\fs20\ls2{{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Competence with Java and XML \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Basic knowledge of Castor XML binding framework \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Experience configuring Java webapp and deploying \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Nominal familiarity with Spring framework \par }\pard\par\par\pard\li0\ri0\f1\fs44\cf0 1.10. \f1\fs44\cf0 Top-down Approach (starting with XML schema): \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Firstly, the XML schema that defines the structure of your web service messages must be developed. For the purposes of this guide, we'll borrow a schema from http://www.webservicex.net/WeatherForecast.asmx?WSDL which defines a pre-existing weather forecast service. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The borrowed schema below should be saved under META-INF/schema/ in the classpath: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Next, we'll use castor to generate POJO classes from the service schema. First, define the source generator task and a goal for generation. The example below is for a maven 1.x configuration. Go to Using the Source Code Generator for a full reference on generating java classes from XML schema. \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After running the generate-source goal, the supporting classes will be in the generated-src directory under the net.webservicex package. Along with each class is an accompanying Descriptor class file (e.g. WeatherDataDescriptor.java) that contains XML binding information. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Next, write a Web service with the support of the generated classes. Note, the example below is a trivial implementation. \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 import net.webservicex.*;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public class WeatherService\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public GetWeatherByZipCodeResponse GetWeatherByZipCode(GetWeatherByZipCode body)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 GetWeatherByZipCodeResponse res = new GetWeatherByZipCodeResponse();\f0\fs20\cf0 \par \f1\fs20\cf0 String zipCode = body.getZipCode();\f0\fs20\cf0 \par \f1\fs20\cf0 if (!zipCode.equals("1050"))\f0\fs20\cf0 \par \f1\fs20\cf0 throw new RuntimeException("Parameter isnt passed correctly. expected: 1050, got "\f0\fs20\cf0 \par \f1\fs20\cf0 + zipCode);\f0\fs20\cf0 \par \f1\fs20\cf0 GetWeatherByZipCodeResult weather = new GetWeatherByZipCodeResult();\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 weather.setLatitude(1);\f0\fs20\cf0 \par \f1\fs20\cf0 weather.setLongitude(1);\f0\fs20\cf0 \par \f1\fs20\cf0 weather.setPlaceName("Vienna, AT");\f0\fs20\cf0 \par \f1\fs20\cf0 weather.setAllocationFactor(1);\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 res.setGetWeatherByZipCodeResult(weather);\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 return res;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After this, configure the service in Xfire. The example below takes the XML configuration approach (which uses Spring integration). In addition, XFire supports integration of configuration into containers such as Plexus and PicoContainer. For more control over the Web service definition, JSR 181 Annotations should be used in the service code. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The configuration goes in the services.xml descriptor. This file goes in META-INF/xfire/ on the classpath: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 foo.bar.WeatherService\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 META-INF/schema/WeatherForecast.xsd\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 #castorServiceFactory\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service definition specifies the web service implementation class with the serviceClass property. A list of can be provided to be included in WSDL generation. In this case, the borrowed schema definition in the classpath at META-INF/schema/WeatherForecast.xsd has been included. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The request and response messages were defined in our schema and were included as a single parameter and return type, respectively, in our service method. This lends itself to a bare (or unwrapped) parameter-style. The service definition specifies a bare parameter-style by setting the style property as 'document'. If a wrapped parameter-style is preferable, the request and response schema definitions and generated classes would not be needed, as the operation name would wrap any request parameters and return type. The style property in the service definition would not be needed as service factories create services as wrapped style by default. The service method signature for a wrapped style service would be: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 public WeatherForecasts GetWeatherByZipCode(String zipCode)\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Service factories are responsible for creating the service inside of XFire. In this case, we want to use an ObjectServiceFactory with Castor binding, so the beans 'castorTypeRegistry', 'bindingProvider' and 'castorServiceFactory' are defined. Notice that these beans are using spring-style bean definitions (e.g. bean id=... ) since XML Configuration uses Spring to build its services. We reference this service factory in the serviceFactory property of the service definition as #castorServiceFactory. The '#' denotes a reference to another defined bean. Read the Bindings section to learn more about setting up service factories with different xml binding mechanisms. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After configuring the service within XFire, the service needs to be exposed so it can be reached by client-proxies. This can be done over HTTP by defining a servlet in the web.xml. Since we have taken the XML Configuration approach, it is best to set up the XFireConfigurableServlet in our web.xml. XFireConfigurableServlet will load the services.xml along with the included org.codehaus.xfire.spring.xfire.xml files upon initialization. Reference the XML Configuration for how to write the web.xml file. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Finally, deploy the web application to your favorite servlet container, and the service should be visible at /services/WeatherService?wsdl under the deployed webapp context path. \par\par\pard\li0\ri0\f1\fs44\cf0 1.11. \f1\fs44\cf0 Bottom-up Approach (starting with Java classes): \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Let's say you want to leverage your pre-existing business code by exposing certain methods with a Web Service. That's not too hard to do with Castor binding and XFire, but it's a different approach that involves mapping Java to XML rather than generating Java classes from schema. Service-oriented architecture discourages simply exposing the domain model, but in this example we're going to be rebellious and not insulate it. This doesn't mean that the bottom-up approach can't follow SOA best practices, altogether. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Below is a Book class that's part of the domain: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public class Book\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 private String title;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 private String isbn;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 private String author;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String getIsbn()\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return isbn;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public void setIsbn(String isbn)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 this.isbn = isbn;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String getTitle()\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return title;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public void setTitle(String title)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 this.title = title;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String getAuthor()\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return author;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public void setAuthor(String author)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 this.author = author;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Next, is a service class that has a couple methods we want to expose as a web service. Note: This service class could have existed already as a business service, or could have been written specifically to be a web service. As you might have noticed, the implementation is quite trivial (ie. stoopid). \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 package foo.bar;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public class BookService\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 private Book onlyBook;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public BookService()\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 onlyBook = new Book();\f0\fs20\cf0 \par \f1\fs20\cf0 onlyBook.setAuthor("Steve Ballmer");\f0\fs20\cf0 \par \f1\fs20\cf0 onlyBook.setTitle("How to Yell Real Loud and Look Like You Might Have a Heart Attack");\f0\fs20\cf0 \par \f1\fs20\cf0 onlyBook.setIsbn("012924828");\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public String addBook(Book book)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return onlyBook.getIsbn();\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public Book findBook(String isbn)\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return onlyBook;\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Let's create an XSD that matches the Book class, so that we know what the XML element for the Book class should look like. The Book.xsd schema below should be saved under META-INF/schema/ in the classpath: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The schema outlines a complex type that has three string elements. It is important to note that the namespace prefix for XML schema namespace is 'xsd' and the namespace prefix for the target namespace is 'tns'. These are the prefixes used by the XFire WSDL builder when creating the schema section, and this schema will actually be inserted inline into the schema section of the WSDL. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Now we need to specify how to transform our Book class to an XML element that conforms to the XSD, and vice versa. This is done with a castor mapping file. More information on writing castor mappings is available at http://www.castor.org/xml-mapping.html \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The castor.xml mapping file below should be saved under the foo.bar package: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Note again, the target namespace and tns prefix are the same as in the XSD. The element-defintion attribute denotes whether the XSD definition is a concrete element or an abstract complex type. In this case, it is a complex type so element-definition is false (which is actually is default value). \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 All the distinct parts are there, time to configure the service in Xfire. The example below takes the XML configuration approach (which uses Spring integration). \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The configuration goes in the services.xml descriptor. This file goes in META-INF/xfire/ on the classpath: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 foo.bar.BookService\f0\fs20\cf0 \par \f1\fs20\cf0 http://xfire.codehaus.org\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 META-INF/schema/Book.xsd\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 #castorServiceFactory\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service definition specifies the web service implementation class with the serviceClass property. A list of schemas can be provided to be included in WSDL generation. In this case, the schema definition in the classpath at META-INF/schema/Book.xsd has been included. Our service is of parameter style 'wrapped', as the method names in the service will wrap our request and response messages (e.g. findBook ). The style property in the service definition is not be needed as service factories create services as wrapped style by default. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Service factories are responsible for creating the service inside of XFire. In this case, we want to use an ObjectServiceFactory with Castor binding, so the beans 'castorTypeRegistry', 'bindingProvider' and 'castorServiceFactory' are defined. Notice that these beans are using spring-style bean definitions (e.g. bean id=... ) since XML Configuration uses Spring to build its services. We reference this service factory in the serviceFactory property of the service definition as #castorServiceFactory. The '#' denotes a reference to another defined bean. The 'castorTypeRegistry' definition sets the 'mappingFile' property to point to the castor.xml mapping file in the classpath. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After configuring the service within XFire, the service needs to be exposed so it can be reached by client-proxies. This can be done over HTTP by defining a servlet in the web.xml. Reference the XML Configuration for how to write the web.xml file. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 After configuring the service and web application, deploy it to your favorite servlet container, and the service should be visible at /services/BookService?wsdl under the deployed webapp context path. \par\par\sect\sectd{\footer }{\header }\pgwsxn11907\pghsxn16840\pard\li0\ri0\f1\fs48\cf2 2. \f1\fs48\cf2 Transports\par\par\pard\li0\ri0\f1\fs44\cf0 2.1. \f1\fs44\cf0 Transports and Channels \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Channels and Transports provide the basic unit of communication in XFire. A Channel simply sends messages (via send()) and listens for messages (via receive()). If you want to send a message to a particular URL you do: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 TransportManager tm = ...;\f0\fs20\cf0 \par \f1\fs20\cf0 Transport t = tm.getTransportForUri("http://foo");\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 OutMessage msg = ...; // create an outmessage yourself\f0\fs20\cf0 \par \f1\fs20\cf0 Channel c = t.createChannel(); // create an anonymous endpoint\f0\fs20\cf0 \par \f1\fs20\cf0 MessageContext context = new MessageContext();\f0\fs20\cf0 \par \f1\fs20\cf0 c.send(msg, context);\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Each transport is responsible for creating its own protocol specific listener, for example a servlet in the case of HTTP. This listener then passes whatever messages it receives to the channel via Channel.receive(MessageContext, InMessage). Channels simply delegate their receive() to a ChannelEndpoint which application specific handling of what to do with the message. The default endpoint is aptly named DefaultEndpoint and will be covered in the next section. \par\pard\li0\ri0\f1\fs40\cf0 2.1.1. \f1\fs40\cf0 InMessage and OutMessage \par\par\f0\fs20\cf0 \par \par\pard\li0\ri0\f1\fs40\cf0 2.1.2. \f1\fs40\cf0 MessageSerializer \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Each OutMessage has a MessageSerializer. A message serializer takes the message body (message.getBody()) and writes it to an XMLStreamWriter that the Channel provides. The semantics of MessageSerializers should be such that they can be invoked multiple times. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.3. \f1\fs40\cf0 Channels/Transports without Services \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Its important to note that Channels and transports are completely independent of XFire's Services. So I can use a channel to send a receive messages and never even create a service. I simply need to provide my own ChannelEndpoint. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.4. \f1\fs40\cf0 DefaultEndpoint and the processing flow \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 DefaultEndpoint takes a message, creates a default message exchange called InMessageExchange and creates a message pipeline. The message pipeline at first consists of the global in handlers from XFire.getInHandlers() and the transport handlers from Transport.getInHandlers. Later on when the service is resolved, the service's handlers get added into the pipeline. Once the operation is resolved, if there is an out message to be set an Out pipeline is created and added to the MessageContext. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.5. \f1\fs40\cf0 Phases and Handlers \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 See Processing Pipeline for now. \par\par\pard\li0\ri0\f1\fs40\cf0 2.1.6. \f1\fs40\cf0 SOAP Processing \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 SOAPTransport.createTransport() adds SOAP support to a particular transport. It does so by adding three additional handlers: \par\f1\fs20\cf0 \pard\ql\fi0\li400\ri0\fs20\ls3{{\listtext\pard\f0\fi0\li400\ri0 1.\tab}\f1\fs20\cf0 ReadHeaderHandler - this handler reads in the soap headers. It stops reading the XML stream the moment the whitespace stops after the Body tag. If it encounters a Fault in the Body, an XFireFault is thrown. [[1]] ValidateHeadersHandler - Ensure that all the necessary headers are understood by the receiving handlers. [[1]] SoapSerializerHandler - Services provide a MessageSerializer of their own which is responsible for serializing the soap body. But what about the message headers? This is written out by the SoapSerializer. What the SoapSerializerHandler does is replace the outMessage.MessageSerializer with new SoapSerializer(outMsg.getMessageSerializer()). \par }\pard\par\pard\li0\ri0\f1\fs40\cf0 2.1.7. \f1\fs40\cf0 MessageExchanges \par\par\f0\fs20\cf0 \par \par\par\pard\li0\ri0\f1\fs44\cf0 2.2. \f1\fs44\cf0 HTTP Transport \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f1\fs40\cf0 2.2.1. \f1\fs40\cf0 XFireServlet \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The core of the HTTP Transport takes place in the XFireServletController. Your own servlets can delegate appropriate requests to this class or you can use one of XFire's internal servlet classes. The XFireServlet is just a thin wrapper for the controller. The XFireServletController provides an xml configuration layer on top of this. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 XFire also provides the XFireConfigurableServlet which reads the services.xml format automatically for you and the XFireSpringServlet which provides Sprign integration. \par\par\pard\li0\ri0\f1\fs40\cf0 2.2.2. \f1\fs40\cf0 HttpServletRequest/HttpServletResponse \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The HttpServletRequest/HttpServletResponse can be accessed via the XFireServletController. \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 HttpServletRequest request = XFireServletController.getRequest();\f0\fs20\cf0 \par \f1\fs20\cf0 HttpServletResponse response = XFireServletController.getResponse();\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This method will work all the XFire servlets (XFireServlet, XFireConfigurableServlet, XFireSpringServlet). \par\par\pard\li0\ri0\f1\fs40\cf0 2.2.3. \f1\fs40\cf0 Client authentication \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The Apache Jakarta HttpClient is used under the covers to provide HTTP client support. There are two ways which you can override the HttpClient settings: \par\f1\fs20\cf0 \pard\ql\fi0\li400\ri0\fs20\ls4{{\listtext\pard\f0\fi0\li400\ri0 1.\tab}\f1\fs20\cf0 You can set the USERNAME/PASSWORD \f1\fs20\cf0 \par {\listtext\pard\f0\fi0\li400\ri0 2.\tab}\f1\fs20\cf0 You can supply your own HttpClientParms \f1\fs20\cf0 \f1\fs20\cf0 The HTTPClient javadocs provide information on how to configure the HttpClientParams. \par }\pard\par\pard\li0\ri0\f1\fs40\cf0 2.2.4. \f1\fs40\cf0 Proxy Support \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Proxy support looks very similar to the username/password scenario: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 // Create your client\f0\fs20\cf0 \par \f1\fs20\cf0 Client client = ....;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 // Or get it from your proxy\f0\fs20\cf0 \par \f1\fs20\cf0 Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();\f0\fs20\cf0 \par \f1\fs20\cf0 client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST, "host");\f0\fs20\cf0 \par \f1\fs20\cf0 client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT, "8080");\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs40\cf0 2.2.5. \f1\fs40\cf0 HTTP Chunking \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 You'll need to enable HTTP chunking on the client if you are sending large files which can't be cached in memory: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 import org.codehaus.xfire.transport.http.HttpTransport;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 Client client = ....;\f0\fs20\cf0 \par \f1\fs20\cf0 client.setProperty(HttpTransport.CHUNKING_ENABLED, "true");\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\par\pard\li0\ri0\f1\fs44\cf0 2.3. \f1\fs44\cf0 JMS Transport \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This guide gives you a quick rundown of how to configure XFire to use JMS as a transport. JMS is one of the easiest means to create a reliable SOAP connection. Additionally it is much faster then things such as WS-Reliability. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 This example assumes that you already know how to: \par\f1\fs20\cf0 \pard\ql\fi0\li300\ri0\fs20\ls5{{\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Configure services via XFire's services.xml format \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Build and deploy simple XFire applications \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 Use your JMS provider \par {\listtext\pard\f2\fi0\li300\ri0 \'b7\tab}\f1\fs20\cf0 A working knowledge of Spring \par }\pard\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 We're just going to show a simple synchronous Echo example running over JMS. The first thing you need to do is create your services.xml file: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 Echo\f0\fs20\cf0 \par \f1\fs20\cf0 org.codehaus.xfire.test.Echo\f0\fs20\cf0 \par \f1\fs20\cf0 org.codehaus.xfire.test.EchoImpl\f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 \f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 There is a lot in here, so lets recap this a little bit. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The xfire section contains a transports element. In transports we are creating our JMSTransport via the Spring bean syntax. XFire will then automatically register this transport for us into the TransportManager. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 The service element contains our service definition. This is pretty standard, except you'll notice we're creating a new binding for JMS. soap11Binding transport="urn:xfire:transport:jms"tells XFire that we want to add a SOAP 1.1 binding for JMS. In the endpoints section we tell XFire exactly what that endpoint will be. The JMS urls take the form of jms:// \pard\f1\fs24\cf0 QueueName \f1\fs20\cf0 . \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 In the sections below we configure our JMS QueueConnectionFactory using ActiveMQ. \par\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 Once all of this is properly configured we will of course want to write a client: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 import java.lang.reflect.Proxy;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.client.XFireProxy;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.client.XFireProxyFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.service.Service;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.service.binding.ObjectServiceFactory;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.spring.AbstractXFireSpringTest;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.test.Echo;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.codehaus.xfire.transport.jms.JMSTransport;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.springframework.context.ApplicationContext;\f0\fs20\cf0 \par \f1\fs20\cf0 import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public class JMSExampleTest\f0\fs20\cf0 \par \f1\fs20\cf0 extends AbstractXFireSpringTest\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 protected ApplicationContext createContext()\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 return new ClassPathXmlApplicationContext(new String[] \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 "/org/codehaus/xfire/transport/jms/example/jms.xml",\f0\fs20\cf0 \par \f1\fs20\cf0 "/org/codehaus/xfire/spring/xfire.xml" \u125?);\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 public void testClient()\f0\fs20\cf0 \par \f1\fs20\cf0 throws Exception\f0\fs20\cf0 \par \f1\fs20\cf0 \u123?\f0\fs20\cf0 \par \f1\fs20\cf0 // Create a ServiceFactory to create the ServiceModel.\f0\fs20\cf0 \par \f1\fs20\cf0 // We need to add the JMSTransport to the list of bindings to create.\f0\fs20\cf0 \par \f1\fs20\cf0 ObjectServiceFactory sf = new ObjectServiceFactory(getTransportManager());\f0\fs20\cf0 \par \f1\fs20\cf0 sf.addSoap11Transport(JMSTransport.BINDING_ID);\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 // Create the service model\f0\fs20\cf0 \par \f1\fs20\cf0 Service serviceModel = sf.create(Echo.class);\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 // Create a proxy for the service\f0\fs20\cf0 \par \f1\fs20\cf0 XFireProxyFactory factory = new XFireProxyFactory(getXFire());\f0\fs20\cf0 \par \f1\fs20\cf0 Echo echo = (Echo) factory.create(serviceModel, "jms://Echo");\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 // Since JMS doesn't really have a concept of anonymous endpoints, we need\f0\fs20\cf0 \par \f1\fs20\cf0 // need to let xfire know what JMS endpoint we should use\f0\fs20\cf0 \par \f1\fs20\cf0 ((XFireProxy) Proxy.getInvocationHandler(echo)).getClient().setEndpointUri("jms://Peer1");\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 // run the client!\f0\fs20\cf0 \par \f1\fs20\cf0 String resString = echo.echo("hello");\f0\fs20\cf0 \par \f1\fs20\cf0 assertEquals("hello", resString);\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \f1\fs20\cf0 \u125?\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\pard\li0\ri0\f1\fs44\cf0 2.4. \f1\fs44\cf0 Local Transport \par\par\f0\fs20\cf0 \par \pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 XFire includes an in-JVM transport called the LocalTransport. If you are using the XFire client or the Channel API, you can address a local service like so: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 xfire.local://FooService\f0\fs20\cf0 \par \cell \row \pard\par\qc\pard\li0\ri0\f0\fs20\cf0 \par \f1\fs20\cf0 For example, when creating a service: \par\f1\fs20\cf0 \par\trowd \trftsWidth3\trwWidth10400\trkeep\trqc\trgaph10\trbrdrl\brdrs\brdrw20\brdrcf0 \trbrdrt\brdrs\brdrw20\brdrcf0 \trbrdrb\brdrs\brdrw20\brdrcf0 \trbrdrr\brdrs\brdrw20\brdrcf0 \trbrdrh\brdrs\brdrw20\brdrcf0 \trbrdrv\brdrs\brdrw20\brdrcf0 \trpaddl100\trpaddr100\trpaddfl3\trpaddfr3 \clbrdrl\brdrs\brdrw10\brdrcf0 \clbrdrt\brdrs\brdrw10\brdrcf0 \clbrdrb\brdrs\brdrw10\brdrcf0 \clbrdrr\brdrs\brdrw10\brdrcf0 \clcbpat1 \clftsWidth3 \clwWidth10400 \clpadl100\clpadt100\clpadr100\clpadb100\clpadfl3\clpadft3\clpadfr3\clpadfb3\cellx10400\intbl\pard\intbl\li0\ri0\f1\fs20\cf0 Service service = getServiceRegistry().getService("FooService");\f0\fs20\cf0 \par \f0\fs20\cf0 \par \f1\fs20\cf0 XFireProxyFactory factory = new XFireProxyFactory(getXFire());\f0\fs20\cf0 \par \f1\fs20\cf0 FooService foo = (FooService) factory.create(service, "xfire.local://FooService");\f0\fs20\cf0 \par \cell \row \pard\par\qc\par\sect}