WSDL to Java

advertisement
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 standalone 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.Service and/or be
annotated with javax.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 wsdl2java tool 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
Download