Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/MOXy/Mapping the Unmappable/Converters"

m (Replacing page with ''''Warning This page is obsolete. Please see ''[http://www.eclipse.org/eclipselink/documentation/ Developing JAXB Applications Using EclipseLink M...')
 
(21 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{EclipseLink_UserGuide
+
'''[[Image:Elug_draft_icon.png|Warning]] This page is obsolete. Please see ''[http://www.eclipse.org/eclipselink/documentation/ Developing JAXB Applications Using EclipseLink MOXy]'' for current information.'''
|info=y
+
|toc=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
|api=y
+
|apis= * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/adapters/XmlAdapter.html XmlAdapter]
+
* [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.html XmlJavaTypeAdapter]
+
}}
+
 
+
= XmlAdapter =
+
 
+
JAXB's '''XmlAdapter''' can be used to map classes that would normally be considered "unmappable" - such as classes that do not have a default no-arg constructor, or classes for which an XML representation cannot be automatically determined.   In a custom subclass of '''XmlAdapter''', you can define define custom code to convert the unmappable class into something that JAXB can handle.  Then, you can use the '''XmlJavaTypeAdapter''' annotation to indicate that your adapter should be used when working with the unmappable class.
+
 
+
== Example ==
+
 
+
Our first example will use the following domain class:
+
 
+
<source lang="java">
+
package example;
+
 
+
import java.util.Currency;
+
 
+
@XmlRootElement
+
@XmlAccessorType(XmlAccessType.FIELD)
+
public class PurchaseOrder {
+
 
+
  private Double amount;
+
 
+
  private Currency currency;
+
 
+
  ...
+
}
+
</source>
+
 
+
Here, the '''Currency''' cannot be automatically mapped with JAXB because it does not contain a no-argument constructor.  However, we can write an adapter that will convert the '''Currency''' into something that JAXB does know how to handle - a simple '''String'''.  Luckily, in this case the '''Currency's''' toString() method returns the currency code, which can also be used to create a new '''Currency''':
+
 
+
<source lang="java">
+
package example;
+
 
+
public class CurrencyAdapter extends XmlAdapter<String, Currency> {
+
 
+
  /*
+
    * Object => XML
+
    * Given the unmappable Java object, return the desired XML representation.
+
    */
+
  public String marshal(Currency val) throws Exception {
+
      return val.toString();
+
  }
+
 
+
  /*
+
    * XML => Object
+
    * Given an XML string, use it to build an instance of the unmappable class.
+
    */
+
  public Currency unmarshal(String val) throws Exception {
+
      return Currency.getInstance(val);
+
  }
+
 
+
}
+
</source>
+

Latest revision as of 13:19, 30 January 2013

Warning This page is obsolete. Please see Developing JAXB Applications Using EclipseLink MOXy for current information.

Back to the top