{"id":2186,"date":"2011-05-12T23:16:06","date_gmt":"2011-05-13T04:16:06","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=2186"},"modified":"2011-05-12T23:16:06","modified_gmt":"2011-05-13T04:16:06","slug":"jaxb-2-0","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=2186","title":{"rendered":"JAXB 2.0"},"content":{"rendered":"<span id=\"Overview\"><h2>Overview<\/h2><\/span>\n<p>* JAXB = Java <strong>Architecture <\/strong>for XML Binding.<br \/>\n* Reference implementation is available at <a href=\"http:\/\/jaxb.java.net\/\">http:\/\/jaxb.java.net\/<\/a><br \/>\n* JAXB 2.0 is part of<br \/>\n&#8211; J2EE 5<br \/>\n&#8211; JDK 6<br \/>\n* JAXB 2.0 requires<br \/>\n&#8211; JDK 1.5<\/p>\n<span id=\"JAXB_2.0_vs_JAXB_1.0\"><h3>JAXB 2.0 vs JAXB 1.0<\/h3><\/span>\n<p>* Schema compiler generates annotated POJOs instead of separate interface and implementation classes for each component of an XML schema.<br \/>\n* Any Java class can be bound to an XML representation via annotations.<br \/>\n* All generated classes are portable among different implementations. In JAXB 1.0, only interfaces are portable.<br \/>\n* JAXB 2.0 does not include validation capabilities. Validation is delegated to JAXP 1.3.<br \/>\n* JAXB 2.0 has complete support for W3C XML Schema. JAXB 1.0 not.<br \/>\n* Integration with StAX to support <\/p>\n<pre lang=\"txt\">javax.xml. stream. XMLStreamWriter\r\njavax.xml.stream.XMLStreamReader\r\njavax.xml.stream.XMLEventWriter\r\njavax.xml.stream.XMLEventReader\r\n<\/pre>\n<p>* JAXB 2.0 supports callback methods for Marshaller and Unmarshaller objects.<\/p>\n<span id=\"Data_Binding:_XML__Java\"><h3>Data Binding: XML <-> Java<\/h3><\/span>\n<p>* A data binding facility contains:<br \/>\n&#8211; schema compiler: xml -> Java<br \/>\n&#8211; schema generator: Java -> xml<br \/>\n* A data binding framework (i.e. runtime API) supports:<br \/>\n&#8211; unmarshalling: xml -> Java<br \/>\n&#8211; marshalling: Java -> xml<br \/>\n&#8211; binding is done via a binder: XML schema <-> JAXB classes<\/p>\n<span id=\"Goals\"><h3>Goals<\/h3><\/span>\n<p>* Full XML Schema support<br \/>\n* Allow binding existing Java classes to generated XML schema, i.e. support from Java approach<br \/>\n* Full JAX-WS 2.0 data binding support<br \/>\n* Support container managed environments<br \/>\n* Support schema evolution<br \/>\n* Application specific behavior<br \/>\n* Support partial mapping of XML document<br \/>\n* Clarify integration with StAX (Streaming API for XML)<br \/>\n* Clarify relationship to other XML related specs<br \/>\n* JAXB mapped classes should be portable<br \/>\n* Support round trippings,<br \/>\n&#8211; Java -> xml -> Java<br \/>\n&#8211; xml -> Java -> xml<br \/>\n* Support unmarshalling invalid XML content<br \/>\n* Ease of use<br \/>\n&#8211; no need to know xml in order to use<br \/>\n* Support customization of<br \/>\n&#8211; xml -> Java<br \/>\n&#8211; Java -> xml<br \/>\n* Schema derived classes should be<br \/>\n&#8211; natural\/readable<br \/>\n&#8211; match conceptual level of source schema<\/p>\n<span id=\"Non-Goals\"><h3>Non-Goals<\/h3><\/span>\n<p>* No backward support for J2SE 4.0 or earlier<br \/>\n* No DTD support<br \/>\n* No support for schema extensions<br \/>\n* No support for SOAP encoding<br \/>\n* No support for validation on demand by schema derived classes<br \/>\n* No support for object graph traversal<br \/>\n* No support for mapping any existing Java classes to any existing XML schema<\/p>\n<span id=\"Reference_Implementations_JAXB_RI\"><h2>Reference Implementations (JAXB RI)<\/h2><\/span>\n<p>* Is an open source project located at <a href=\"https:\/\/jaxb.dev.java.net\">https:\/\/jaxb.dev.java.net<\/a><br \/>\n* Included in Java Web Services Developer Pack (JWSDP)<\/p>\n<span id=\"Download_and_Install\"><h3>Download and Install<\/h3><\/span>\n<p>* Download a desired version from <a href=\"http:\/\/jaxb.java.net\">http:\/\/jaxb.java.net<\/a>.<br \/>\n* Unpack<\/p>\n<pre lang=\"txt\">\r\njava -jar JAXB2_<release date>.jar\r\n<\/pre>\n<p>* For example,<br \/>\n&#8211; Download JAXB 2.2 jar file named <a href=\"http:\/\/jaxb.java.net\/2.2\/JAXB2_20091104.jar\">JAXB2_20091104.jar<\/a> from <a href=\"http:\/\/jaxb.java.net\/2.2\/\">http:\/\/jaxb.java.net\/2.2\/<\/a><br \/>\n&#8211; Unpack with <\/p>\n<pre lang=\"txt\">\r\njava -jar JAXB2_20091104.jar\r\n<\/pre>\n<p>&#8211; jaxb-ri-20091104 directory is created.<\/p>\n<span id=\"Core_Classes\"><h3>Core Classes<\/h3><\/span>\n<p>* JAXBContext<br \/>\n* Marshaller<br \/>\n* Unmarshaller<\/p>\n<span id=\"Compile_Schema\"><h3>Compile Schema<\/h3><\/span>\n<p>* Generates annotated POJOs<br \/>\n* Use xjc command line utility<\/p>\n<pre lang=\"txt\">\r\nC:\\jaxb-ri-20091104\\bin>xjc -help\r\nUsage: xjc [-options ...] <schema file\/URL\/dir\/jar> ... [-b <bindinfo>] ...\r\nIf dir is specified, all schema files in it will be compiled.\r\nIf jar is specified, \/META-INF\/sun-jaxb.episode binding file will be compiled.\r\nOptions:\r\n  -nv                :  do not perform strict validation of the input schema(s)\r\n  -extension         :  allow vendor extensions - do not strictly follow the\r\n                        Compatibility Rules and App E.2 from the JAXB Spec\r\n  -b <file\/dir>      :  specify external bindings files (each <file> must have its own -b)\r\n                        If a directory is given, **\/*.xjb is searched\r\n  -d <dir>           :  generated files will go into this directory\r\n  -p <pkg>           :  specifies the target package\r\n  -httpproxy <proxy> :  set HTTP\/HTTPS proxy. Format is [user[:password]@]proxyHost:proxyPort\r\n  -httpproxyfile <f> :  Works like -httpproxy but takes the argument in a file to protect password\r\n  -classpath <arg>   :  specify where to find user class files\r\n  -catalog <file>    :  specify catalog files to resolve external entity references\r\n                        support TR9401, XCatalog, and OASIS XML Catalog format.\r\n  -readOnly          :  generated files will be in read-only mode\r\n  -npa               :  suppress generation of package level annotations (**\/package-info.java)\r\n  -no-header         :  suppress generation of a file header with timestamp\r\n  -target 2.0        :  behave like XJC 2.0 and generate code that doesnt use any 2.1 features.\r\n  -xmlschema         :  treat input as W3C XML Schema (default)\r\n  -relaxng           :  treat input as RELAX NG (experimental,unsupported)\r\n  -relaxng-compact   :  treat input as RELAX NG compact syntax (experimental,unsupported)\r\n  -dtd               :  treat input as XML DTD (experimental,unsupported)\r\n  -wsdl              :  treat input as WSDL and compile schemas inside it (experimental,unsupported)\r\n  -verbose           :  be extra verbose\r\n  -quiet             :  suppress compiler output\r\n  -help              :  display this help message\r\n  -version           :  display version information\r\n\r\nExtensions:\r\n  -Xinject-code      :  inject specified Java code fragments into the generated code\r\n  -Xlocator          :  enable source location support for generated code\r\n  -Xsync-methods     :  generate accessor methods with the 'synchronized' keyword\r\n  -mark-generated    :  mark the generated code as @javax.annotation.Generated\r\n  -episode <FILE>    :  generate the episode file for separate compilation\r\n<\/pre>\n<p>* Use xjc Ant task (See sample below)<\/p>\n<span id=\"JAXB_Annotations\"><h3>JAXB Annotations<\/h3><\/span>\n<span id=\"Class-level_Annotations\"><h4>Class-level Annotations<\/h4><\/span>\n<p>* XmlRootElement<br \/>\n* XmlAccessorType.<br \/>\n    PUBLIC_MEMBER \/\/ Default. Marshals all public getter\/setter pairs<br \/>\n    FIELD  \/\/ Marshals all nonstatic and nontransient field in the class<br \/>\n    PROPERTY \/\/ Like PUBLIC_MEMBER, but also marshals private, protected, or package-only getter\/setter pairs<br \/>\n    NONE  \/\/ NO child elements will be marshalled automatically<br \/>\n* XmlType<br \/>\n* Example<\/p>\n<pre lang=\"xml\">\r\n@XmlAccessorType(XmlAccessType. FIELD)\r\n@XmlType(name = \"\", propOrder = {\r\n    \"firstName\",\r\n    \"lastName\"\r\n})\r\n@XmlRootElement(name = \"person\")\r\npublic class Person {\r\n}\r\n<\/pre>\n<span id=\"Filed-level_Annotations\"><h4>Filed-level Annotations<\/h4><\/span>\n<p>* XmlElement<br \/>\n    required<br \/>\n    nillable<br \/>\n    defaultValue<br \/>\n* Example<\/p>\n<pre lang=\"xml\">\r\n@XmlElement(required = true)\r\nprotected String firstName;\r\n@XmlElement(required = true)\r\nprotected String lastName;\r\n<\/pre>\n<span id=\"Package-level_annotations\"><h4>Package-level annotations<\/h4><\/span>\n<p>* Howto<br \/>\n&#8211; Create a file called package-info.java<br \/>\n&#8211; Add a regular Java package declaration to it<br \/>\n&#8211; Add annotations to it<br \/>\n* Example<\/p>\n<pre lang=\"xml\">\r\n@javax. xml. bind. annotation. XmlSchema(\r\n    namespace = \"http: \/\/www. example. com\/person\",\r\n    elementFormDefault = javax. xml. bind. annotation. XmlNsForm. QUALIFIED\r\n)\r\npackage javaxml3;\r\n<\/pre>\n<p>&#8211; declare namespace prefixes:<\/p>\n<pre lang=\"xml\">\r\n@javax. xml. bind. annotation. XmlSchema(\r\n    namespace = \"http: \/\/www. example. com\/person\",\r\n    elementFormDefault = javax. xml. bind. annotation. XmlNsForm. QUALIFIED,\r\n    xmlns = {\r\n        @javax. xml. bind. annotation. XmlNs(prefix = \"p\",\r\n            namespaceURI=\"http: \/\/www. example. com\/person\")\r\n    }\r\n)\r\npackage javaxml3;\r\n<\/pre>\n<span id=\"Schema_Compilation_Customization\"><h3>Schema Compilation Customization<\/h3><\/span>\n<p>* Conceptually similar to annotation<br \/>\n* Can be contained in<br \/>\n&#8211; schema file<br \/>\n&#8211; external binding file<br \/>\n&#8211; both<br \/>\n* Customization are for elements within the namespace http:\/\/java.sun.com\/xml\/ns\/jaxb<\/p>\n<span id=\"Inline_Declarations\"><h4>Inline Declarations<\/h4><\/span>\n<span id=\"Schema_Generation\"><h3>Schema Generation<\/h3><\/span>\n<p>* Use schemagen command line utility to generate XML schema from annotated Java classes.<\/p>\n<pre lang=\"txt\">\r\n<\/pre>\n<span id=\"Marshalling\"><h3>Marshalling<\/h3><\/span>\n<span id=\"UnMarshalling\"><h3>UnMarshalling<\/h3><\/span>\n<span id=\"Examples\"><h2>Examples<\/h2><\/span>\n<span id=\"Books_Example\"><h3>Books Example<\/h3><\/span>\n<p>* <a href=\"http:\/\/www.oracle.com\/technetwork\/articles\/javase\/index-140168.html\">http:\/\/www.oracle.com\/technetwork\/articles\/javase\/index-140168.html<\/a><br \/>\n* Generate Java with Ant<br \/>\n&#8211; copy books.xsd to src directory<br \/>\n&#8211; binding classes are generated in the src directory in package test.jaxb<\/p>\n<pre lang=\"xml\">\r\n  <property environment=\"env\"\/>\r\n  <property name=\"jaxws.lib.dir\" value=\"${env.JAXWS_HOME}\/lib\"\/>\r\n\r\n<path id=\"jaxws.classpath\">\r\n      <fileset dir=\"${jaxws.lib.dir}\">\r\n          <include name=\"*.jar\"\/>\r\n      <\/fileset>\r\n  <\/path>\r\n\r\n<taskdef name=\"xjc\" classname=\"com.sun.tools.xjc.XJCTask\">\r\n      <classpath refid=\"jaxws.classpath\"\/>\r\n<\/taskdef>\r\n\r\n<target name=\"generate-java\" \r\n      description=\"Generate Java from xml schema\">\r\n  <xjc schema=\"src\/books.xsd\" \r\n     destdir=\"src\" \r\n     package=\"test.jaxb\"\/>\r\n<\/target>\r\n<\/pre>\n<p>* Marshalling\/Unmarshalling<\/p>\n<pre lang=\"java\">\r\ntry {\r\n  System.out.println(\"Getting JAXBContext...\");\r\n  JAXBContext ctx = JAXBContext.newInstance(\"test.jaxb\");\r\n  System.out.println(\"Got JAXBContext.\");\r\n\r\n  System.out.println(\"Getting Unmarshaller...\");\r\n  Unmarshaller um = ctx.createUnmarshaller();\r\n\r\n  \/\/ Validate against schema\r\n  Schema schema = \r\n    SchemaFactory.newInstance(\r\n      XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(\r\n          new File(\"src\" + File.separator + \"books.xsd\"));\r\n  um.setSchema(schema);\r\n  System.out.println(\"Got Unmarshaller.\");\r\n\r\n  System.out.println(\"Getting book colleciton...\");\r\n  Collection bookcol = (Collection)\r\n    um.unmarshal(new File(\"src\" + File.separator + \"books.xml\"));\r\n  System.out.println(\"Got book colleciton.\");\r\n\r\n  List<BookType> booklist = bookcol.getBooks().getBook();\r\n  for (int i = 0; i < booklist.size(); i++){\r\n    BookType book = booklist.get(i);\r\n    System.out.println(\"Got book: \" + book.getName());\r\n  }\r\n\r\n  \/\/ Marshal back\r\n  System.out.println(\"Getting Marshaller...\");\r\n  Marshaller m = ctx.createMarshaller();\r\n    m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );\r\n  System.out.println(\"Got Marshaller.\");\r\n\r\n  System.out.println(\"Marshalling to screen...\");\r\n  m.marshal(bookcol, System.out);\r\n} catch (JAXBException e) {\r\n  \/\/ TODO Auto-generated catch block\r\n  e.printStackTrace();\r\n} catch (SAXException e) {\r\n  \/\/ TODO Auto-generated catch block\r\n  e.printStackTrace();\r\n}\r\n<\/pre>\n<span id=\"References\"><h2>References<\/h2><\/span>\n<p>* <a href=\"http:\/\/jcp.org\/aboutJava\/communityprocess\/mrel\/jsr222\/index.html\">JSR-222 JAXB<\/a><br \/>\n* <a href=\"http:\/\/jaxb.java.net\/nonav\/jaxb20-fcs\/docs\/api\/index.html\">JAXB 2.0 API<\/a><br \/>\n* <a href=\"http:\/\/jaxb.java.net\/tutorial\/index.html\">java.net jaxb tutorial<\/a><br \/>\n* <a href=\"http:\/\/www.oracle.com\/technetwork\/articles\/javase\/index-140168.html\">http:\/\/www.oracle.com\/technetwork\/articles\/javase\/index-140168.html<\/a><br \/>\n* Java and XML, Third Edition By: Brett McLaughlin; Justin Edelson<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview * JAXB = Java Architecture for XML Binding. * Reference implementation is available at http:\/\/jaxb.java.net\/ * JAXB 2.0 is part of &#8211; J2EE 5 &#8211; JDK 6 * JAXB 2.0 requires &#8211; JDK 1.5 JAXB 2.0 vs JAXB 1.0 &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=2186\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[95],"tags":[],"class_list":["post-2186","post","type-post","status-publish","format-standard","hentry","category-jaxb"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-zg","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2186"}],"version-history":[{"count":10,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2186\/revisions"}],"predecessor-version":[{"id":2281,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/2186\/revisions\/2281"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}