[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] MOXy JAXB Eclipselink Workbench - wrong unmarshall

Title: MOXy JAXB Eclipselink Workbench - wrong unmarshall

Hello,
can you please help me to understand what's wrong in my simple unmarshall example?

Libraries used:
- jdk 1.5.0_16
- EclipseLink 2.2.0
- javax.xml.stream_1.0.1
- javax.xml.bind_2.2.0

Xml file:
<PaymentInf>
        <id>pmtid</id>
        <PmtInf>
                <service>
                        <id>SEPA</id>
                </service>
                <amount>
                        <val>1</val>
                </amount>
                <date>2010-12-27</date>
        </PmtInf>
        <CreditorFrstName>
                <cd>myfrstname</cd>
                <id>frstId</id>
        </CreditorFrstName>
        <CreditorLstName>
                <cd>mylastname</cd>
        </CreditorLstName>
</PaymentInf>

java classes (getter and setter are here hidden):
public class PaymentInf {
        private String id;
        private String service;
        private BigDecimal amount;
        private Date date;
        private Creditor creditor;
}

public class Creditor {
        private String firstName;
        private String lastName;
        private String id;
}

Test code:
JAXBContext context = JAXBContextFactory.createContext("payment", getClass().getClassLoader());
InputStream payment = getClass().getClassLoader().getResourceAsStream("payment.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
PaymentInf pmt = (PaymentInf) unmarshaller.unmarshal(payment);

It works properly only if i map all xml fields and only if <id> tag is not duplicated (i have to change service id tag to idserv and creditorFrstName id tag to idcred).

If i didn't map the <service> tag and <id> field is duplicated then:
- amount is null
- date is null
- id is null
- service is null
- creditor firstName is properly unmarshalled
- creditor lastName is properly unmarshalled
- creditor id is "frstIdfrstId" (duplicated)

If i didn't map the <service> tag and <id> field is not duplicated then:
- amount is null
- date is null
- id is properly unmarshalled
- service is null
- creditor firstName is properly unmarshalled
- creditor lastName is properly unmarshalled
- creditor id is is properly unmarshalled

What is wrong?

Thank you for your attention,
Daniele

p.s. Here the xml mapping generated by Eclipselink Workbench used in the test:
<?xml version="1.0" encoding="UTF-8"?>
<object-persistence xmlns="http://www.eclipse.org/eclipselink/xsds/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence" version="Eclipse Persistence Services - 2.1.2.v20101206-r8635">
   <name>payment</name>
   <class-mapping-descriptors>

      <class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
         <class>dto.PaymentInf</class>
         <alias>PaymentInf</alias>
         <events/>
         <querying/>
         <attribute-mappings>
            <attribute-mapping xsi:type="xml-composite-object-mapping">
               <attribute-name>creditor</attribute-name>
               <reference-class>dto.Creditor</reference-class>
               <field name="." xsi:type="node"/>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>id</attribute-name>
               <field name="id/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>service</attribute-name>
               <field name="PmtInf/service/id/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>amount</attribute-name>
               <field name="PmtInf/amount/val/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>date</attribute-name>
               <field name="PmtInf/date/text()" xsi:type="node">
                  <schema-type>{http://www.w3.org/2001/XMLSchema}date</schema-type>
               </field>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
         </attribute-mappings>
         <descriptor-type>aggregate</descriptor-type>
         <instantiation/>
         <copying xsi:type="instantiation-copy-policy"/>
         <default-root-element>PaymentInf</default-root-element>
         <default-root-element-field name="PaymentInf"/>
      </class-mapping-descriptor>

      <class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
         <class>dto.Creditor</class>
         <alias>Creditor</alias>
         <events/>
         <querying/>
         <attribute-mappings>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>firstName</attribute-name>
               <field name="CreditorFrstName/cd/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>id</attribute-name>
               <field name="CreditorFrstName/id/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
            <attribute-mapping xsi:type="xml-direct-mapping">
               <attribute-name>lastName</attribute-name>
               <field name="CreditorLstName/cd/text()" xsi:type="node"/>
               <null-policy xsi:type="null-policy">
                  <empty-node-represents-null>true</empty-node-represents-null>
                  <null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>
               </null-policy>
            </attribute-mapping>
         </attribute-mappings>
         <descriptor-type>aggregate</descriptor-type>
         <instantiation/>
         <copying xsi:type="instantiation-copy-policy"/>
         <should-preserve-document>true</should-preserve-document>
      </class-mapping-descriptor>

   </class-mapping-descriptors>
   <login xsi:type="xml-login">
      <platform-class>org.eclipse.persistence.oxm.platform.SAXPlatform</platform-class>
      <user-name></user-name>
   </login>
</object-persistence>

Here is session.xml:
<?xml version="1.0" encoding="UTF-8"?>
<sessions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.1.2">
   <session xsi:type="database-session">
      <name>payment</name>
      <event-listener-classes/>
      <logging xsi:type="eclipselink-log"/>
      <primary-project xsi:type="xml">mapping.xml</primary-project>
      <login xsi:type="xml-login">
         <platform-class>org.eclipse.persistence.oxm.platform.SAXPlatform</platform-class>
         <document-preservation-policy xsi:type="no-document-preservation-policy">
            <node-ordering-policy xsi:type="append-new-elements-ordering-policy"/>
         </document-preservation-policy>
      </login>
   </session>
</sessions>