350 likes | 459 Views
Web Services with Apache CXF Part 2 : JAXB and WSDL to Java. Robert Thornton. Notes. This is a training, NOT a presentation Please ask questions This is being recorded https://tech.lds.org/wiki/Java_Stack_Training Prerequisites Maven, Spring, and Web Application Development
E N D
Web Services with Apache CXF Part 2: JAXB and WSDL to Java Robert Thornton
Notes • This is a training, NOT a presentation • Please ask questions • This is being recorded • https://tech.lds.org/wiki/Java_Stack_Training • Prerequisites • Maven, Spring, and Web Application Development • Web Services, Part I: SOAP • A general familiarity with XML simple and complex schema types.
Objectives At the end of this presentation, the participant will be able to: • Understand the role of JAXB as a web service data binding solution. • Model data entities using JAXB annotations. • Understand the purpose and usage of the CXF WSDL2Java tool. • Be able to use WSDL2Java to generate a client proxy in a stand-alone Java application. • Be able to configure Spring to manage and consume a generated WSDL2Java client proxy .
Web Services with Apache CXF Java XML Binding Modeling Web Service Messages with JAXB
Java and XML The Marriage of XML and Java: • XML is a data markup language. • Used for long or short-term data storage. • Useful for data transfer between vastly different architectures. • Particularly useful for web service architectures. • Java is an object-oriented programming language. • Unmarshalls (reads) data from existing XML into Java data objects. • Performs manipulations on Java objects via services. • Marshalls (writes) Java objects into a new XML representation.
Java and XML: Choices, choices…. The marriage of Java and XML has produced a large family of technologies, strategies, and libraries: • DOM • StAX • JAXP • DOM4J • JAXB • XML Beans • JDOM • XStream • and many more….
Java and XML: Overview Most Java XML strategies fall into three spaces: • DOM (Document Object Model) • Entire document model is held in memory as nodes in a document tree. • Streaming • An event-based API for operating on each piece of the XML document individually and in sequence. Often used to stream XML for building DOM trees or construct XML Object bindings. • XML-to-Object Binding • XML types and elements are bound to Java types and fields. In practice, most solutions use some combination of these.
JAXB: A Data Binding Solution The JAXB API is the standard solution provided by the JDK for Java XML data binding: • Java classes are bound to XML types, elements, and attributes through Java annotations. • A XML streaming event-based (StAX) parser is used to parse XML documents and construct Java objects as well as to write Java objects back to XML. • The XJC tool (included in the JDK) can generate JAXB annotated classes from an existing XML Schema. • The Schemagen tool (also included in the JDK) can generate an XML schema from JAXB annotated classes.
JAXB and Web Services As a data modeling API, JAXB is particularly useful to web services, because: • XML is the most common form of data transport. • Annotated Java classes can be made to represent XML schema types. • JAXB APIs can unmarshall XML into Java data objects and back again. • Fits into an RPC-style of service method invocation with POJO parameters and results. * Note that the CXF web service framework automatically handles the marshalling and unmarshalling of XML data to and from JAXB annotated Java classes.
JAXB: Marshalling and Unmarshalling Although CXF handles the marshalling and unmarshalling of serviced XML, it can be helpful to know how CXF does it. • A web service developer occasionally needs to experiment with how JAXB annotations affect the parsing and rendering of XML. • A web service developer often needs to debug issues that arise from data being marshalled or unmarshalled incorrectly. • The JAXB Marshalling/Unmarshalling APIs can be used to apply additional validation or to generate a schema.
JAXB: Unmarshalling JAXB makes unmarshalling from XML easy: // Just create a JAXB context for your Java data classes JAXBContext jaxb = JAXBContext.newInstance(myClasses); // Then unmarshall the XML document into instances of // those classes. MyClass obj = (MyClass) jaxb.createUnmarshaller().unmarshall(xml) The Unmarshaller can accept XML input as a character stream, a file, a DOM node, or several other input types.
JAXB: Marshalling Marshalling objects into XML is just as easy: // Create a JAXB context for your Java data classes JAXBContext jaxb = JAXBContext.newInstance(myClasses); // Marshall your Java object hierarchy into an XML document. jaxb.createMarshaller().marshall(myObject, output); The Marshaller can serialize the XML to a character stream, a file, a DOM node, or several other output types.
JAXB: The Context Instances of the JAXBContext class effectively represent an “in-memory” schema of your data: • It is a registry of all the classes that can be bound to XML types. • It is a factory for Marshaller and Unmarshaller instances. • It can be supplied listeners and a Schema for additional validation. • It can be used to generate an XML Schema from your JAXB annotated classes.
JAXB: Non-annotated Class Demo Demo XML Output without JAXB Annotations
JAXB: Annotations Although JAXB can bind almost any Java data object with little or no annotations, annotations are typically desirable, for example: • They can tell JAXB whether to unmarshal a field into an attribute or an element. • They can inform JAXB of ID fields, element order, and other schema constraints. • They can be used to identify or customize schema types, element names, attribute names, element wrapping, etc.
JAXB: Common Annotations JAXB defines many annotations to customize Java XML data binding. Here are just a few: • @XmlRootElement • @XmlElement • @XmlAttribute • @XmlElementWrapper • @XmlElementRef • @XmlElementRefs • @XmlTransient These and more can be found in the following package: • javax.xml.bind.annotation • <insert link to docs or tutorial>
JAXB: Non-annotated Class Demo Demo XML Output with JAXB Annotations
JAXB: Rules and Conventions Some general rules about JAXB annotations: • Concrete classes must have a public default no-arg constructor. • Properties that reference interfaces must be annotated with one or more @XmlElementRef annotations that identify the possible concrete types. • Annotations may be placed on the fields or on the setters but not on both. • By convention, annotating fields is preferable for simple POJOs. • Properties not bound to XML values must be annotated with @XmlTransient.
Apache CXF: SOAP: Lab 1 Lab 1: JAXB Data Binding http://tech.lds.org/wiki/Web_Services_with_Apache_CXF_-_Part_2
Web Services with Apache CXF WSDL to Java Consuming 3rd Party Web Services
WSDL 2 Java Third-party SOAP web services are typically consumed in one of two ways: • Using a client JAR prepared by the service provider. • Contains the necessary Java classes and stubs for accessing the web service. • Using a WSDL-to-Java tool. • Automatically generates the necessary Java classes and stubs from a published web service descriptor, or WSDL.
WSDL to Java: Code Generation What is generated by a WSDL to Java tool? • A service client. • Will extend javax.xml.ws.Serviceand/or be annotated withjavax.xml.ws.@WebServiceClient • One or more service endpoint interfaces. • Will have the @javax.jws.WebService annotation • Model classes bound to any complex XML types used by the service. • Will have with JAXB annotations.
WSDL to Java: Code Generation Demos http://www.webservicex.net/geoipservice.asmx?wsdl A Generated Web Service Client A Generated Endpoint Interface Generated JAXB Model Classes
WSDL 2 Java: Code Generation Client code generation is cool, but … When do you use it?
WSDL to Java: Code Generation Option #1: One-time generation • Run command-line tools and copy to project. • wsimport (JDK) • http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html) • wsdl2java (CXF) • http://cxf.apache.org/docs/wsdl-to-java.html • IDE Web Service Client Wizards When to use? • Need to customize what is generated • Want to avoid dependence on build tools
WSDL to Java: Code Generation Option #2: Build-time generation • Using Maven Plugins: • org.codehaus.mojo:jaxws-maven-plugin • Uses the JDK wsimport tool • org.apache.cxf:cxf-codegen-plugin • Uses the CXF wsdl2java tool When to use? • Need to stay up-to-date with a changing WSDL. • Don’t need to tweak generated code • Don’t want to own or manage the generated source code.
WSDL to Java: Code Generation Due to its rich Spring integration, the Java Stack recommends the CXF wsdl2javatool to consume third-party SOAP services. Maven Usage: <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <executions>...</executions> </plugin>
Maven execution: <execution> <id>wsdl2java</id> <phase>generate-sources</phase> <goals><goal>wsdl2java</goal></goals> <configuration> <wsdlOptions> <wsdlOption> <wsdl>${wsdlUrl}</wsdl> </wsdlOption> </wsdlOptions> </configuration> </execution>
WSDL to Java: Lab 2 Lab 2: Using WSDL to Java http://tech.lds.org/wiki/Web_Services_with_Apache_CXF_-_Part_2
WSDL to Java: Spring Integration Managing the generated endpoint with Spring: • When the generated stubs aren’t enough. • Need to apply security (WSS4J/Spring Security) • Need to apply additional in/out interceptors • Stack namespace handler: <stack-ws:consume/> • To simplify common security and configuration needs • http://code.lds.org/schema/spring/ws/stack-ws-1.1.xsd • CXF namespace handler: <jaxws:client/> • For more advanced client configuration.
WSDL to Java: Spring Configuration Attributes to <stack-ws:consume/> • service-class • The bean name of the endpoint implementation class. • endpoint • The published endpoint service address. • user, password, password-type • For user authentication. Both plain text and digest passwords are supported. • wam-authenticator, wam-cookie-resolver-ref • Provides authentication through WAM • ssl-trust-server • Specifies whether the server’s SSL cert should be automatically trusted.
WSDL to Java: Spring Configuration Example Usage: <stack-ws:consume service-class="org.lds.MyService" endpoint="http://www.lds.org/myservice"> <stack-ws:in-interceptors> <bean idref="customInInterceptor2"/> </stack-ws:in-interceptors> <stack-ws:out-interceptors> <bean idref="customOutInterceptor1"/> </stack-ws:out-interceptors> </stack-ws:consume>
WSDL to Java: Spring Integration Demo Using an endpoint interface generated by WSDL to Java in a Spring integration test.
Conclusion • The standard Java APIs can be used to model your data for use by web services. • The JDK, CXF, and the Java Stack provide code generation and configuration utilities to make it easier to consume third-party web services. • For more information about JAXB and CXF, please visit the links on the following page.
Resources On the web: • http://cxf.apache.org • Java 6 API Documentation • JDK 6 Programmer Guides • Java Stack Documentation