Jump to: navigation, search

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

Line 34: Line 34:
 
</source>
 
</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''':
+
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">
 
<source lang="java">
Line 42: Line 42:
  
 
   /*
 
   /*
     *
+
     * Object => XML
 +
    * Given the unmappable Java object, return the desired XML representation.
 
     */
 
     */
  public Currency unmarshal(String val) throws Exception {
 
      return Currency.getInstance(val);
 
  }
 
 
 
   public String marshal(Currency val) throws Exception {
 
   public String marshal(Currency val) throws Exception {
 
       return val.toString();
 
       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>
 
</source>

Revision as of 15:29, 6 June 2011

EclipseLink MOXy

link="http://wiki.eclipse.org/EclipseLink"
EclipseLink
Website
Download
Community
Mailing ListForumsIRC
Bugzilla
Open
Help Wanted
Bug Day
Contribute
Browse Source

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:

package example;
 
import java.util.Currency;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class PurchaseOrder {
 
   private Double amount;
 
   private Currency currency;
 
   ...
}

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:

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);
   }
 
}