JBoss at Work Chapter 10 Web Services - PowerPoint PPT Presentation

1 / 45
About This Presentation
Title:

JBoss at Work Chapter 10 Web Services

Description:

Wish to partner with Virtual Big Auto Dealership, (VBAD), so to benefit from VBAD's high-traffic web site which markets auto dealer inventories ... – PowerPoint PPT presentation

Number of Views:31
Avg rating:3.0/5.0
Slides: 46
Provided by: triton8
Category:
Tags: chapter | jboss | services | web | work

less

Transcript and Presenter's Notes

Title: JBoss at Work Chapter 10 Web Services


1
JBoss at WorkChapter 10Web Services
  • COSC617, FALL 2006, Jeff Schmitt

Presenters Steven R. Bussow Givry Mbouna
2
Web Services - useful to JAW Motors?
  • Jaw Motors has J2EE-based web site
  • Wish to partner with Virtual Big Auto Dealership,
    (VBAD), so to benefit from VBADs high-traffic
    web site which markets auto dealer inventories
  • One problem - VBAD doesnt use J2EE

3
Web Services solution to cross-platform
  • Deploy a portion of JAW Motors application,
    (inventory), as a Web Service so it can work with
    non-Java clients
  • Show EJB as a Web Service by using XDocklet and
    Java Web Services Developer Pack (JWSDP) to
    deploy it on JBoss
  • Bridge the gap by writing an Axis client to
    use/consume our Web Service

4
Web Services invocation
  • VBADs web site acts as the external client,
    invoking JAW Motors findAvailableCars() Web
    Service to get inventory information
  • Client uses a Web Service proxy object to marshal
    the method findAvailableCars() call as a Simple
    Object Access Protocol (SOAP) Request and sends
    it to the JBoss application server
  • The SOAP Servlet receives SOAP Request, looks up
    findAvailableCars() service in Web Service
    Definition Language (WSDL) file, and then invokes
    findAvailableCars() method on behalf of the
    client
  • findAvailableCars() method finds desired
    inventory info and packages it into CarDTO
    objects, then returns control to the SOAP Servlet
  • SOAP Servlet marshals the CarDTO objects into
    SOAP Response, returns response to caller /
    client
  • Web Service proxy object (back on client)
    unmarshals the SOAP Response into CarDTO objects
    to display on the VBAD web site

5
Web Services invocation
JBOSS
SOAP request / response
Web service client
SOAP Servlet
findAvailableCars() (inventory EJB)
WSDL
6
Web Services terminology
  • SOAP an XML-based, platform neutral, wire
    protocal that enables remote communication.
    Client and server communicate using SOAP Messages
    that contain a Header and a Body. Header holds
    routing information, Body holds request /
    response data.
  • WSDL XML-based interface descriptor that
    describes a web service interface along with its
    parameters. WSDL registers your Web Service with
    your server in the same way web.xml registers
    Servlets and ejb-jar.xml registers EJBs.
  • Web Service Proxy set of objects that work
    together to encapsulate low-level SOAP
    communication details and invoke a Web Service on
    behalf of a client. SOAP toolkits are available
    for most programming languages that user the WSDL
    to generate Web Serviced proxy code for the
    language of the intended client
  • SOAP Servlet as of J2EE 1.4, most application
    servers use a Servlet to listen for SOAP
    Requests, rout them to a Web Service, and return
    the result(s) as a SOAP Response

7
Web Services JBoss background
  • JBoss.NET was used to deploy Web Services, but
    too proprietary
  • JBossWS is JBosss new J2EE 1.4-complient Web
    Service implementation, based on Apache Axis and
    uses J2EE standard deployment descriptors and
    technology, most bugs were removed in JBoss
    4.01sp1
  • Server requires us to create a Service Endpoint
    Interface and register it with the deployment
    descriptors.
  • We can implement a Service Endpoint as a Servlet
    or POJO deployed in a WAR file, or as a Stateless
    Session Bean, but, we observe the EJB Service
    Endpoints in our example

8
Implementing J2EE 1.4 Web Services
  • To expose InventoryFacadeBeans
    findAvailableCars() method as a J2EE 1.4
    compliant Web Service, we must do the following
    (mostly now automated with Ant, XDoclet, and
    JWSDP)
  • Create a Service Endpoint Interface (SEI) to
    expose EJB methods as Web Service operations
  • Add a ltservice-endpointgt element to ejb-jar.xml
    to tell JBoss that the InventoryFacadeBean EJB
    implements the InventoryEndpoint Service Endpoint
    Interface
  • Generate the webservices.xml to register the Web
    Service and tie the InventoryEndpoint Service
    Endpoint Interface to an implementation the
    InventoryFacadeBean
  • Create a JAX-RPC Mapping File to define JAX-RPC
    type mappings for the parameters and return
    values for the InventoryEndpoints methods
  • Generate a WSDL to define the Web Service and tie
    it to XML Schema data types
  • Set the Web Service URL by modifying jboss.xml
    with the Inventory Web Service URL
  • Modify our EJB, the Inventory FacadeBean
  • Add Web Services-related XDoclet tags
  • Add the findAvailableCars() method and use an XML
    Schema-compatible data type
  • Upgrade the Deployment by modifying the Ant build
    script

9
Service EndPoint Interface (SEI)
  • SEI exposes business methods as Web Services that
    can be accessed by external clients
  • SEI acts as a server-side stub that shows your
    business methods to clients and serves the same
    purpose for a Web Service that an EJB Remote
    Interface does for an EJB
  • The InventoryEndpoint interface is a Remote
    interfcae, and the findAvailable Cars() method
    throws a Remote Exception
  • The CarDTOArray (that holds an array of CarDTO
    objects) is returned by the findAvailable Cars()
    method
  • /InventoryEndpoint.java example/
  • package com.jbossatwork.ws
  • /
  • Service endpoint interface for
    InventoryFacade.
  • /
  • public interface InventoryEndpoint
  • extends java.rmi.Remote

10
Modifying ejb-jar.xml
  • We already generated the ejb-jar.xml descriptor
    to deploy EJBs
  • Now we have to add a ltservice-endpointgt element
    to that ejb-jar.xml
  • The ltservice-endpointgt will tell JBoss that the
    InventoryFacadeBean EJB implements the
    InventoryEndpoint interface

/ ejb-jar.xml example / ltenterprise-bea
nsgt ltsessiongt
ltdisplay-namegtInventoryFacadeSBlt/display-namegt
ltejb-namegtInventoryFacadelt/ejb-namegt
ltservice-endpointgtcom.jbossatwork.ws.InventoryEnd
pointlt/service-endpointgt lt/sessiongt
lt/enterprise-beansgt
11
webservices.xml
  • The webservices.xml file defines and registers
    the InventoryService Web Service Endpoint, and
    ties the Service Endpoint Interface class
    (com.jbossatwork.ws.InventoryEndpoint) to the
    InventoryFacadeBean EJB
  • Our webservices.xml file example also tells JBoss
    where to find the WSDL and JAX-RPC Mapping files
    in the EJB JAR file

12
webservices.xml example
  • lt?xml version"1.0" encoding"UTF-8"?gt
  • ltwebservices
  • xmlns"http//java.sun.com/xml/ns/j2ee"
  • xmlnsxsi"http//www.w3.org/2001/XMLSchema-insta
    nce"
  • xsischemaLocation"http//java.sun.com/xml/ns/j2
    ee
  • http//www.ibm.com/webservices/xsd/j2ee_web_servic
    es_1_1.xsd"
  • version"1.1"gt
  • ltwebservice-descriptiongt
  • ltwebservice-description-namegtInventoryServ
    icelt/webservice-description-namegt
  • ltwsdl-filegtMETA-INF/wsdl/InventoryService.
    wsdllt/wsdl-filegt
  • ltjaxrpc-mapping-filegtMETA-INF/inventory-ma
    pping.xmllt/jaxrpc-mapping-filegt
  • ltport-componentgt
  • ltport-component-namegtInventorylt/port-c
    omponent-namegt
  • ltwsdl-portgtInventoryEndpointPortlt/wsdl
    -portgt
  • ltservice-endpoint-interfacegt
  • com.jbossatwork.ws.InventoryEndpoi
    nt
  • lt/service-endpoint-interfacegt
  • ltservice-impl-beangt
  • ltejb-linkgtInventoryFacadelt/ejb-
    linkgt

13
JAX-RPC Mapping file
  • The JAX-RPC mapping file helps the compiler map
    Java objects to WSDL objects
  • Our JAX-RPC mapping file tells JBoss that the
    InventoryEndpoint Service Endpoint Interface has
    a findAvailableCars() method that takes no
    parameters and returns a CarDTOArray
  • Each ltjava-xml-type-mappinggt element in the
    JAX-RPC mapping file lists each of the Java
    objects data members with a ltvariable-mappinggt
    sub-element (it gets fairly tedious)
  • Notice how our example return type, CarDTOArray,
    expands into two ltjava-xml-type-mappinggt elements
  • One for the CarDTOArray itself
  • One for the CarDTO

14
JAX-RPC Mapping file example
  • lt?xml version"1.0" encoding"UTF-8"?gt
  • ltjava-wsdl-mapping xmlns"http//java.sun.com/xml/
    ns/j2ee"
  • xmlnsxsi"http//www.w3.org/2001/XMLSchema-instan
    ce"
  • xsischemaLocation"http//java.sun.com/xml/ns/j2e
    e
  • http//www.ibm.com/webservices/xsd/j2ee_jaxrpc_ma
    pping_1_1.xsd" version"1.1"gt
  • ltpackage-mappinggt
  • ltpackage-typegtcom.jbossatwork.wslt/package-type
    gt
  • ltnamespaceURIgthttp//localhost8080/jbossatwor
    k-ws/typeslt/namespaceURIgt
  • lt/package-mappinggt
  • ltpackage-mappinggt
  • ltpackage-typegtcom.jbossatwork.wslt/package-type
    gt
  • ltnamespaceURIgthttp//localhost8080/jbossatwor
    k-wslt/namespaceURIgt
  • lt/package-mappinggt
  • ltjava-xml-type-mappinggt
  • ltjava-typegtcom.jbossatwork.dto.CarDTOArraylt/ja
    va-typegt
  • ltroot-type-qname xmlnstypeNS"http//localhos
    t8080/jbossatwork-ws/types"gt
  • typeNSCarDTOArray
  • lt/root-type-qnamegt
  • ltqname-scopegtcomplexTypelt/qname-scopegt

15
JAX-RPC Mapping file example continued
  • ltjava-xml-type-mappinggt
  • ltjava-typegtcom.jbossatwork.dto.CarDTOlt/java-ty
    pegt
  • ltroot-type-qname xmlnstypeNS"http//localhos
    t8080/jbossatwork-ws/types"gt
  • typeNSCarDTO
  • lt/root-type-qnamegt
  • ltqname-scopegtcomplexTypelt/qname-scopegt
  • ltvariable-mappinggt
  • ltjava-variable-namegtidlt/java-variable-namegt
  • ltxml-element-namegtidlt/xml-element-namegt
  • lt/variable-mappinggt
  • ltvariable-mappinggt
  • ltjava-variable-namegtmakelt/java-variable-name
    gt
  • ltxml-element-namegtmakelt/xml-element-namegt
  • lt/variable-mappinggt
  • ltvariable-mappinggt
  • ltjava-variable-namegtmodellt/java-variable-nam
    egt
  • ltxml-element-namegtmodellt/xml-element-namegt
  • lt/variable-mappinggt
  • ltvariable-mappinggt

16
JAX-RPC Mapping file example concluded
  • variable-mappinggt
  • ltjava-variable-namegtstatuslt/java-variable-na
    megt
  • ltxml-element-namegtstatuslt/xml-element-namegt
  • lt/variable-mappinggt
  • lt/java-xml-type-mappinggt
  • ltservice-interface-mappinggt
  • ltservice-interfacegtcom.jbossatwork.ws.Inventor
    yServicelt/service-interfacegt
  • ltwsdl-service-name xmlnsserviceNS"http//loc
    alhost8080/jbossatwork-ws"gt
  • serviceNSInventoryService
  • lt/wsdl-service-namegt
  • ltport-mappinggt
  • ltport-namegtInventoryEndpointPortlt/port-namegt
  • ltjava-port-namegtInventoryEndpointPortlt/java-
    port-namegt
  • lt/port-mappinggt
  • lt/service-interface-mappinggt
  • ltservice-endpoint-interface-mappinggt
  • ltservice-endpoint-interfacegt
  • com.jbossatwork.ws.InventoryEndpoint
  • lt/service-endpoint-interfacegt

17
WSDL File
  • WSDL file describes a Web Service interface along
    with its parameters and registers the web service
    with JBoss.
  • Our WSDL file ties the InventoryService web
    service to the InventoryEndpoint interface and
    maps the CarDTO and CarDTOArray WSDL types to XSD
    data types
  • This line in the WSDL file tells JBoss that it
    can choose its own URL for the web service
  • ltsoapaddress locationPUT_YOUR_OWN_URL_HERE/gt
  • Without the above line, JBoss deploys our WSDL to
    the following default URL
  • http//localHost8080/jaw/ejb/Inventory?wsdl

18
WSDL File example
  • lt?xml version"1.0" encoding"UTF-8"?gt
  • ltdefinitions name"InventoryService"
  • targetNamespace"http//localhost8080/jbossatwork
    -ws"
  • xmlnstns"http//localhost8080/jbossatwork-ws"
  • xmlns"http//schemas.xmlsoap.org/wsdl/"
  • xmlnsxsd"http//www.w3.org/2001/XMLSchema"
  • xmlnsns2"http//localhost8080/jbossatwork-ws/ty
    pes"
  • xmlnssoap"http//schemas.xmlsoap.org/wsdl/soap/"
    gt
  • lttypesgt
  • ltschema targetNamespace"http//localhost8080
    /jbossatwork-ws/types"
  • xmlnstnshttp//localhost8080/jbossa
    twork-ws/types
  • xmlnssoap11-enc"http//schemas.xmlso
    ap.org/soap/encoding/"
  • xmlnsxsi"http//www.w3.org/2001/XMLS
    chema-instance"
  • xmlnswsdl"http//schemas.xmlsoap.org
    /wsdl/"
  • xmlns"http//www.w3.org/2001/XMLSchem
    a"gt
  • ltcomplexType name"CarDTOArray"gt
  • ltsequencegt
  • ltelement name"cars" type"tnsCarDTO"
    nillable"true" minOccurs"0"
  • maxOccurs"unbounded"/gtlt/sequen
    cegt

19
WSDL File example concluded
  • ltmessage name"InventoryEndpoint_findAvailableCars
    "/gt
  • ltmessage name"InventoryEndpoint_findAvailableCa
    rsResponse"gt
  • ltpart name"result" type"ns2CarDTOArray"/gtlt/
    messagegt
  • ltportType name"InventoryEndpoint"gt
  • ltoperation name"findAvailableCars"gt
  • ltinput message"tnsInventoryEndpoint_findAv
    ailableCars"/gt
  • ltoutput message"tnsInventoryEndpoint_findA
    vailableCarsResponse"/gt
  • lt/operationgt
  • lt/portTypegt
  • ltbinding name"InventoryEndpointBinding"
    type"tnsInventoryEndpoint"gt
  • ltsoapbinding transport"http//schemas.xmlsoa
    p.org/soap/http" style"rpc"/gt
  • ltoperation name"findAvailableCars"gt
  • ltsoapoperation soapAction""/gt
  • ltinputgt
  • ltsoapbody use"literal"
    namespace"http//localhost8080/jbossatwork-ws"/gt
  • lt/inputgt
  • ltoutputgt
  • ltsoapbody use"literal"
    namespace"http//localhost8080/jbossatwork-ws"/gt
  • lt/outputgt

20
Set the Web Service URL
  • If we want to use a meaningful URL to match our
    Web Service namespace, jbossatwork-ws, we modify
    the jboss.xml (the JBoss EJB deployment
    descriptor)
  • The ltport-componentgt element and its sub-elements
    tell JBoss to deploy our WSDL to the
    jbossatwork-ws namespace at the following URL
  • http//localhost8080/jbossatwork-ws/InventoryServ
    ice?wsdl
  • Remember, modifying the jboss.xml file to set our
    URL is purely optional

21
Set the Web Service URL jboss.xml example
  • lt?xml version"1.0" encoding"UTF-8"?gt
  • lt!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS
    4.0//EN"
  • "http//www.jboss.org/j2ee/
    dtd/jboss_4_0.dtd"gt
  • ltjbossgt
  • ltenterprise-beansgt
  • ltsessiongt
  • ltejb-namegtInventoryFacadelt/ejb-namegt
  • ltport-componentgt
  • ltport-component-namegtInventorylt/port-compo
    nent-namegt
  • ltport-component-urigtjbossatwork-ws/Invento
    ryService
  • lt/port-component-urigt
  • lt/port-componentgt
  • lt/sessiongt
  • lt/enterprise-beansgt
  • lt/jbossgt

22
Modify the InventoryFacadeBean EJB
  • We add a new method called findAvailableCars()
    which we are exposing as a Web Service
  • findAvailableCars() wraps the listAvailableCars()
    method and converts its return value,
    java.util.List, to a CarDTOArray
  • Setting the view-type to all in the class-level
    _at_ejb.bean tag tells XDoclet to generated the
    Service Endpoint Interface along with the EJB
    Remote and Local Component interfaces
  • Setting the veiw-type to both in the class-level
    _at_ejb.interface-method tells XDoclet to exclude
    all other business methods from the Service
    Endpoint Interface

23
Modify the InventoryFacadeBean EJB example
  • /
  • _at_ejb.bean
  • name"InventoryFacade"
  • view-type"all"
  • _at_wsee.port-component
  • name"Inventory"
  • wsdl-port"InventoryEndpointPort"
  • service-endpoint-interface"com.jbossatwork.ws
    .InventoryEndpoint"
  • service-endpoint-bean"com.jbossatwork.ejb.Inv
    entoryFacadeBean"
  • _at_ejb.interface
  • service-endpoint-class"com.jbossatwork.ws.Inv
    entoryEndpoint"
  • /
  • public class InventoryFacadeBean implements
    SessionBean

24
Web Services Data Types
  • Real world data types get complex
  • Our InventoryEndpoint.java, for example
  • public com.jbossatwork.dto.CarDTOArray
    findAvailableCars() throws java.rmi.RemoteExceptio
    n
  • ...
  • findAvailableCars() returns a CarDTOArray object
    that encapsulates an array of CarDTO objects
  • Each application-specific class must follow the
    JavaBeans conventions
  • It must have a default constructor
  • Each private or protected data member must have a
    corresponding public getter and setter

25
Web Services Data Types continued
  • Our CarDTO make data member is a String, so the
    getter and setter must look as follows
  • private String make
  • public String getMake()
  • return make
  • public void setMake(String make)
  • this.make make

26
Web Services and Collections
  • J2EE Web Services cannot exchange Collections or
    arrays of custom data types
  • Solution wrap your array in a JavaBean
  • We must wrap an array of CarDTOs in a CarDTOArray
    object
  • Though a somewhat complex solution, we reach the
    Web Service goal of interoperability

package com.jbossatwork.dto import
java.io.Serializable import com.jbossatwork.dto.C
arDTO public class CarDTOArray implements
Serializable private CarDTO cars
public CarDTOArray() public CarDTO
getCars() return cars
public void setCars(CarDTO cars)
this.cars cars
27
Web Services Deployment
  • EJB JAR file structure
  • Automating web services deployment
  • Tools
  • Ant Script

28
EJB JAR file structure
  • The new files go into the EJB JAR file as
    follows
  • META-INF/
  • ejb-jar.xml
  • jboss.xml
  • webservices.xml
  • Inventory-mapping.xml( the JAX-RPC mapping file)
  • wsdl/
  • InventoryService.wsdl
  • com/jbossatwork/ws/
  • InventoryEndpoint.class
  • Everything else remains unchanged

29
Automating Web Services DeploymentWhat are we
automating?
  • Create three new descriptors
  • webservices.xml
  • JAX-RPC Mapping file
  • WSDL
  • Generate Service Endpoint Interface
  • Modify both EJB deployment descriptors
  • ejb-jar.xml
  • jboss.xml

30
What About the Tools?
  • XDoclet has limited support for Web Services
  • Can generate (with minor mistakes)
  • Service Endpoint Interface
  • webservice.xml
  • Modify ejb-jar.xml
  • Ant fixes XDoclets mistakes
  • JWSDP (Java Web Services Developers Pack)
  • Generate WSDL and JAX-RPC Mapping Files

31
Web Services Ant Script
  • Generate Service Endpoint Interface
  • Fix the URL
  • Generate webservices.xml
  • Fix webservices.xml
  • Generate JAX-RPC Mapping and WSDL files

32
Ant Script Generate Service Endpoint Interface
  • ltproperty name"jwsdp.lib.dir" value"/Library/jws
    dp-1.5"/gt
  • lttarget name"run-ejbdoclet" gt
  • ltejbdoclet gt
  • ltservice-endpoint/gt
  • lt/ejbdocletgt
  • lt!-- Fix problems with XDoclet-generated
    Service Endpoint Interface --gt
  • ltreplace file"gen.source.dir/c
    om/jbossatwork/ws/InventoryEndpoint.java"gt
  • ltreplacetokengtlt!CDATAthrows
    javax.ejb.EJBException,
  • java.rmi.RemoteExceptiongtlt/replacetokengt
  • ltreplacevaluegtlt!CDATAthrows
    java.rmi.RemoteExceptiongtlt/replacevaluegt
  • lt/replacegt

33
Ant Script Fix the URL
  • lt!-- Fix WS URL in jboss.xml --gt
  • ltreplace file"gen.source.dir/jboss.xml
    "gt
  • ltreplacetokengtlt!CDATAltejb-namegtInvento
    ryFacadelt/ejb-namegtgt
  • lt/replacetokengt
  • ltreplacevaluegtlt!CDATA
  • ltejb-namegtInventoryFacadelt
    /ejb-namegt
  • ltport-componentgt
  • ltport-component-namegtInv
    entorylt/port-component-namegt
  • ltport-component-urigtjbos
    satwork-ws/InventoryService
  • lt/port-component-urigt
  • lt/port-componentgt
  • gtlt/replacevaluegt
  • lt/replacegt
  • lt/targetgt

34
Ant Script Generate webservices.xml
  • lttarget name"run-wseedoclet" depends"run-ejbdocl
    et"gt
  • lttaskdef name"wseedoclet"
  • classname"xdoclet.modules.wsee.W
    seeDocletTask"
  • classpathref"xdoclet.lib.path"/gt
  • ltwseedoclet wsdlFile"META-INF/wsdl/Invent
    oryService.wsdl"
  • jaxrpcMappingFile"META-INF/in
    ventory-mapping.xml"
  • wseeSpec"1.1"
  • destdir"gen.source.dir"
  • excludedtags"_at_version,_at_author
    "
  • addedtags"_at_xdoclet-generated
    at TODAY"
  • verbose"true"gt
  • ltfileset dir"source.dir"gt
  • ltinclude name"/Bean.java"/gt
  • lt/filesetgt
  • ltdeploymentdescriptor
    name"InventoryService"/gt
  • lt/wseedocletgt

35
Ant Script Fix webservices.xml
  • lt!-- Fix problems with XDoclet-generated
    webservices.xml --gt
  • ltreplace file"gen.source.dir/webservic
    es.xml"gt
  • ltreplacetokengtlt!CDATAltwsdl-filegtWEB-
    INF/gtlt/replacetokengt
  • ltreplacevaluegtlt!CDATAltwsdl-filegtgtlt
    /replacevaluegt
  • lt/replacegt
  • ltreplace file"gen.source.dir/webservic
    es.xml"gt
  • ltreplacetokengtlt!CDATAltjaxrpc-mapping
    -filegtWEB-INF/gtlt/replacetokengt
  • ltreplacevaluegtlt!CDATAltjaxrpc-mapping
    -filegtgtlt/replacevaluegt
  • lt/replacegt
  • ltreplace file"gen.source.dir/webservic
    es.xml"gt
  • ltreplacetokengtlt!CDATAlticongtgtlt/repl
    acetokengt
  • ltreplacevaluegtlt!CDATAgtlt/replaceval
    uegt
  • lt/replacegt
  • ltreplace file"gen.source.dir/webservic
    es.xml"gt
  • ltreplacetokengtlt!CDATAlt/icongtgtlt/rep
    lacetokengt
  • ltreplacevaluegtlt!CDATAgtlt/replaceval
    uegt

36
Ant Script Generate JAX-RPC Mapping and WSDL
files
  • lttarget name"run-wscompile" depends"compile"gt
  • ltecho message"Generating JAX-RPC Mapping
    and WSDL files."/gt
  • ltpath id"wscompile.task.classpath"gt
  • ltfileset dir"jwsdp.lib.dir"gt
  • ltinclude name"/.jar"/gt
  • lt/filesetgt
  • ltfileset dir"java.home/../lib"
    includes"tools.jar"/gt
  • lt/pathgt
  • ltwscompile base"build.dir"
  • fork"true"
  • server"true"
  • features"rpcliteral"
  • mapping"gen.source.dir/inve
    ntory-mapping.xml"
  • config"wscompile-config.xml"
  • nonClassDir"gen.source.dir"
    gt

37
J2EE Web Services Checklist
  • Created the InventoryEndpoint Service Interface
    (SEI) to expose EJB methods as Web service
    operations
  • Added a ltservice-endpointgt element to ejb-jar.xml
    to tell JBoss that the InventoryFacadeBean EJB
    implements the InventoryEndpoint Service Endpoint
    Interface
  • Generated the webservices.xml to register the Web
    Service and tie the InventoryEndpoint Service
    Endpoint Interface to an implementation- the
    InventoryFacadeBean
  • Created the JAX-RPC Mapping File to define
    JAX-RPC type mappings for the parameters and
    return values for the InventoryEndpoints method

38
J2EE Web Services Checklist...continued
  • Generated the inventory-mapping.xml WSDL file to
    define the Web Service and tie it to XML Schema
    data types
  • Set the Web Service URL by modifying jboss.xml
    with the Inventory Web Service URL
  • Modified the InventoryFacadeBean
  • Upgraded deployment by modifying the Ant script

39
Testing Web Services Deployment
  • Here are the steps to build and deploy the
    application
  • Type ant in the root directory of ch10 to build
    the project
  • Shut down JBoss so the Ant script can clean up
    the JBoss deployment area
  • Type ant colddeploy to deploy the EAR file
    (jaw.ear) to the JBOSS_HOME/server/default/deploy
    directory
  • Start JBoss back up

40
Web Services Client
  • In order to test the web service, we need to add
    an external client application. So we would use a
    well-known API for invoking the Inventory Web
    Service methods.
  • JNDI
  • JAX-RPC
  • Apache Axis
  • Perl, Python, C

41
Implementing a Web Service Client
  • Download the WSDL from http//localhost8080/jboss
    atwork-ws/InventoryService?wsdl
  • Generate Web Service proxy and custom data type
    objects by using the Axis WSDL2Java Ant task
  • Write a Web Service client that uses the
    Axis-generated proxy and custom data type objects
    to call the Web Service

42
Generate Web Service Proxy Code
  • ltpath id"axis.classpath"gt
  • ltfileset dir"axis.lib.dir"gt
  • ltinclude name"/.jar"/gt
  • lt/filesetgt
  • lt/pathgt
  • lttarget name"run-wsdl2java"
    description"Generates WS proxy code from WSDL"gt
  • ltpath id"wsdl2java.task.classpath"gt
  • ltpath refid"axis.classpath"/gt
  • lt/pathgt
  • ltwsdl2java output"gen.source.dir"
  • url"InventoryService.wsdl"
  • verbose"true"gt
  • ltmapping namespace"http//localhost8
    080/jbossatwork-ws"
  • package"com.jbossatwork.clie
    nt"/gt
  • ltmapping namespace"http//localhost8
    080/jbossatwork-ws/types"

43
Client Code
  • package com.jbossatwork.client
  • public class MyAxisClient
  • public static void main(String args)
  • try
  • System.out.println("Finding
    InventoryService ...\n")
  • InventoryService service new
    InventoryServiceLocator()
  • System.out.println("Getting InventoryEndpoint
    ...\n")
  • InventoryEndpoint endpoint
    service.getInventoryEndpointPort()
  • System.out.println("Getting Cars ...")

44
Testing the Web Service Client
  • After generating Web Service proxy code and
    writing a client to call the findAvailableCars
    Web Service, we would go to the ch10/client
    sub-directory, and compile and run the client by
    typing ant run-client

45
Questions?
Write a Comment
User Comments (0)
About PowerShow.com