Difference between revisions of "EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions"

From Eclipsepedia

Jump to: navigation, search
(Specifying MOXy Extensions)
(XML Output)
 
(3 intermediate revisions by one user not shown)
Line 3: Line 3:
 
This example will build upon the lessons learned in the previous example ([[EclipseLink/Examples/MOXy/GettingStarted/JAXBCustomizations|JAXB Customizations]]), and demonstrate how MOXy extensions can be used to further customize the XML output.
 
This example will build upon the lessons learned in the previous example ([[EclipseLink/Examples/MOXy/GettingStarted/JAXBCustomizations|JAXB Customizations]]), and demonstrate how MOXy extensions can be used to further customize the XML output.
  
==Specifying MOXy Extensions==
+
==Using MOXy Extensions==
  
Some of the MOXy extensions are available through EclipseLink annotations, others require programmatic changes to the underlying metadata.  The EclipseLink annotation @XmlCustomizer is used to provide the hook necessary to customize the underlying metadata.
+
Some of the MOXy extensions are available through EclipseLink annotations, others require programmatic changes to the underlying metadata.  The EclipseLink annotation @XmlPath is used to specify path based mappings.
  
 
<source lang="java">
 
<source lang="java">
 
package example.gettingstarted;
 
package example.gettingstarted;
 
+
 
import java.util.ArrayList;
 
import java.util.ArrayList;
 
import java.util.List;
 
import java.util.List;
 
+
 
import javax.xml.bind.annotation.XmlRootElement;
 
import javax.xml.bind.annotation.XmlRootElement;
 
import javax.xml.bind.annotation.XmlType;
 
import javax.xml.bind.annotation.XmlType;
  
import org.eclipse.persistence.oxm.annotations.XmlCustomizer;
+
import org.eclipse.persistence.oxm.annotations.XmlPath;
 
+
 
@XmlRootElement
 
@XmlRootElement
 
@XmlType(propOrder={"name", "address", "phoneNumbers"})
 
@XmlType(propOrder={"name", "address", "phoneNumbers"})
@XmlCustomizer(CustomerCustomizer.class)
 
 
public class Customer {
 
public class Customer {
 
+
 
     private String name;
 
     private String name;
 
     private Address address;
 
     private Address address;
 
     private List<PhoneNumber> phoneNumbers;
 
     private List<PhoneNumber> phoneNumbers;
 
+
 
     public Customer() {
 
     public Customer() {
 
         phoneNumbers = new ArrayList<PhoneNumber>();
 
         phoneNumbers = new ArrayList<PhoneNumber>();
 
     }
 
     }
 
+
 +
    @XmlPath("personal-info/name/text()")
 
     public String getName() {
 
     public String getName() {
 
         return name;
 
         return name;
 
     }
 
     }
 
+
 
     public void setName(String name) {
 
     public void setName(String name) {
 
         this.name = name;
 
         this.name = name;
 
     }
 
     }
 
+
 +
    @XmlPath("contact-info/address")
 
     public Address getAddress() {
 
     public Address getAddress() {
 
         return address;
 
         return address;
 
     }
 
     }
 
+
 
     public void setAddress(Address address) {
 
     public void setAddress(Address address) {
 
         this.address = address;
 
         this.address = address;
 
     }
 
     }
 
+
 +
    @XmlPath("contact-info/phone-number")
 
     public List<PhoneNumber> getPhoneNumbers() {
 
     public List<PhoneNumber> getPhoneNumbers() {
 
         return phoneNumbers;
 
         return phoneNumbers;
 
     }
 
     }
 
+
 
     public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
 
     public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
 
         this.phoneNumbers = phoneNumbers;
 
         this.phoneNumbers = phoneNumbers;
 
     }
 
     }
 
+
 
}
 
}
 
</source>
 
</source>
  
==Using the MOXy Extensions==
+
==Converting Objects to XML==
 +
 
 +
The following code is used to convert the objects to XML.  This is the same code from the previous example ([[EclipseLink/Examples/MOXy/GettingStarted/JAXBCustomizations|JAXB Customizations]]).
  
 
<source lang="java">
 
<source lang="java">
 
package example.gettingstarted;
 
package example.gettingstarted;
  
import org.eclipse.persistence.config.DescriptorCustomizer;
+
import javax.xml.bind.JAXBContext;
import org.eclipse.persistence.descriptors.ClassDescriptor;
+
import javax.xml.bind.JAXBException;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
+
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
+
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
+
  
public class CustomerCustomizer implements DescriptorCustomizer {
+
public class Demo {
  
     public void customize(ClassDescriptor descriptor) throws Exception {
+
     public static void main(String[] args) throws JAXBException {
        XMLDirectMapping nameMapping = (XMLDirectMapping) descriptor.getMappingForAttributeName("name");
+
        nameMapping.setXPath("personal-info/name/text()");
+
  
         XMLCompositeObjectMapping addressMapping = (XMLCompositeObjectMapping) descriptor.getMappingForAttributeName("address");
+
         // Step 1 - Create the Domain Model
         addressMapping.setXPath("contact-info/address");
+
 
 +
        Customer customer = new Customer();
 +
        customer.setName("Jane Doe");
 +
 
 +
        Address address = new Address();
 +
        address.setStreet("123 Any Street");
 +
         address.setCity("My Town");
 +
        customer.setAddress(address);
 +
 
 +
        PhoneNumber workPhoneNumber = new PhoneNumber();
 +
        workPhoneNumber.setType("work");
 +
        workPhoneNumber.setValue("613-555-1111");
 +
        customer.getPhoneNumbers().add(workPhoneNumber);
 +
 
 +
        PhoneNumber cellPhoneNumber = new PhoneNumber();
 +
        cellPhoneNumber.setType("cell");
 +
        cellPhoneNumber.setValue("613-555-2222");
 +
        customer.getPhoneNumbers().add(cellPhoneNumber);
 +
 
 +
        // Step 2 - Convert the Domain Model to XML
 +
 
 +
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
 +
 
 +
        Marshaller marshaller = jaxbContext.createMarshaller();
 +
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 +
 
 +
        marshaller.marshal(customer, System.out);
  
        XMLCompositeCollectionMapping phoneNumbersMapping = (XMLCompositeCollectionMapping) descriptor.getMappingForAttributeName("phoneNumbers");
 
        phoneNumbersMapping.setXPath("contact-info/phone-number");
 
 
     }
 
     }
  
Line 87: Line 111:
 
==XML Output==
 
==XML Output==
  
The following is the resulting XML.   
+
The following is the resulting XML.  In the next example ([[EclipseLink/Examples/MOXy/GettingStarted/ExternalizedMetadata|Externalized Metadata]]) we will demonstrate how use XML instead of annotations to represent the metadata.
 +
 
  
 
<source lang="xml">
 
<source lang="xml">

Latest revision as of 14:51, 16 June 2010

Contents

[edit] Overview

This example will build upon the lessons learned in the previous example (JAXB Customizations), and demonstrate how MOXy extensions can be used to further customize the XML output.

[edit] Using MOXy Extensions

Some of the MOXy extensions are available through EclipseLink annotations, others require programmatic changes to the underlying metadata. The EclipseLink annotation @XmlPath is used to specify path based mappings.

package example.gettingstarted;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
 
import org.eclipse.persistence.oxm.annotations.XmlPath;
 
@XmlRootElement
@XmlType(propOrder={"name", "address", "phoneNumbers"})
public class Customer {
 
    private String name;
    private Address address;
    private List<PhoneNumber> phoneNumbers;
 
    public Customer() {
        phoneNumbers = new ArrayList<PhoneNumber>();
    }
 
    @XmlPath("personal-info/name/text()")
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @XmlPath("contact-info/address")
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    @XmlPath("contact-info/phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }
 
    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
 
}

[edit] Converting Objects to XML

The following code is used to convert the objects to XML. This is the same code from the previous example (JAXB Customizations).

package example.gettingstarted;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
 
public class Demo {
 
    public static void main(String[] args) throws JAXBException {
 
        // Step 1 - Create the Domain Model
 
        Customer customer = new Customer();
        customer.setName("Jane Doe");
 
        Address address = new Address();
        address.setStreet("123 Any Street");
        address.setCity("My Town");
        customer.setAddress(address);
 
        PhoneNumber workPhoneNumber = new PhoneNumber();
        workPhoneNumber.setType("work");
        workPhoneNumber.setValue("613-555-1111");
        customer.getPhoneNumbers().add(workPhoneNumber);
 
        PhoneNumber cellPhoneNumber = new PhoneNumber();
        cellPhoneNumber.setType("cell");
        cellPhoneNumber.setValue("613-555-2222");
        customer.getPhoneNumbers().add(cellPhoneNumber);
 
        // Step 2 - Convert the Domain Model to XML
 
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
 
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
 
        marshaller.marshal(customer, System.out);
 
    }
 
}

[edit] XML Output

The following is the resulting XML. In the next example (Externalized Metadata) we will demonstrate how use XML instead of annotations to represent the metadata.


<?xml version="1.0" encoding="UTF-8"?>
<customer>
   <personal-info>
      <name>Jane Doe</name>
   </personal-info>
   <contact-info>
      <address>
         <city>My Town</city>
         <street>123 Any Street</street>
      </address>
      <phone-number type="work">613-555-1111</phone-number>
      <phone-number type="cell">613-555-2222</phone-number>
   </contact-info>
</customer>