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/Examples/MOXy/GettingStarted/MOXyExtensions"

(Specifying MOXy Extensions)
(XML Output)
 
(3 intermediate revisions by the same 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

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.

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

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

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>

Back to the top