Jaxb unmarshalling:没有得到我的收藏元素

时间:2012-04-23 16:31:23

标签: java xml collections jaxb unmarshalling

我是Jaxb的新手,这是我第一次使用它。我有一个xml,我希望它被翻译成我现有的对象。我成功地使用了简单的属性和元素,但是对于集合,我得到了空集合。

我想用xml生成版权持有者实例。我创建了一个http post方法来发送xml并使用注释来解组它。要生成post方法,我使用名为Poster的firefox插件。版权所有者的所有集合都无法加载。 (PS:未映射合同集合)。对post方法的调用有效,版权所有者已创建,但所有集合都是空的。我想我错过了注释的东西。

感谢任何帮助。

类:

CopyrightHolderContacts:

 @XmlRootElement(name="Contact", namespace="http://www.example.org/common")
 //@XmlType(name="Contact", namespace="http://www.example.org/common")
 public class CopyHolderContacts implements Contact, Serializable {



    private Long idContact;
    private CopyrightHolder copyrightHolder;
    private String name;
    private String email;
    private String office;
    private String work;
    private String mobile;
    private Boolean notify;

    public CopyHolderContacts() {
    }

    public CopyHolderContacts(CopyrightHolder copyrightHolder, String name, String email) {
        this.copyrightHolder = copyrightHolder;
        this.name = name;
        this.email = email;
    }

    public CopyHolderContacts( CopyrightHolder copyrightHolder, String name, String email, String office,
            String work, String mobile, Boolean notify ) {
        this.copyrightHolder = copyrightHolder;
        this.name = name;
        this.email = email;
        this.office = office;
        this.work = work;
        this.mobile = mobile;
        this.notify = notify;
    }

    @XmlTransient
    public Long getIdContact() {
        return this.idContact;
    }

    public void setIdContact( Long idContact ) {
        this.idContact = idContact;
    }

    @XmlTransient
    public CopyrightHolder getCopyrightHolder() {
        return this.copyrightHolder;
    }

    public void setCopyrightHolder(CopyrightHolder copyrightHolder) {
        this.copyrightHolder = copyrightHolder;
    }

    @XmlAttribute
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlAttribute
     public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @XmlAttribute(name="phoneOffice")
    public String getOffice() {
        return this.office;
    }

    public void setOffice(String office) {
        this.office = office;
    }

    @XmlAttribute(name="phoneWork")
    public String getWork() {
        return this.work;
    }

    public void setWork(String work) {
        this.work = work;
    }

    @XmlAttribute(name="phoneMobile")
    public String getMobile() {
        return this.mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    @XmlAttribute
    public Boolean getNotify() {
        return this.notify;
    }

    public void setNotify(Boolean notify) {
        this.notify = notify;
    }

   }

CopyrightHolder:

import static javax.persistence.GenerationType.SEQUENCE;

import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.annotations.Cascade;


@XmlRootElement(name="CopyrightHolder", namespace="http://www.example.org/copyrightholder")
@XmlSeeAlso(CopyHolderContacts.class)
@Entity
public class CopyrightHolder implements Serializable {

    private Long idCopyrightHolder;
    private String name;
    private String address;
    private String affiliation;
    private Set<CopyHolderDocuments> copyHolderDocuments = new HashSet<CopyHolderDocuments>( 0 );
    private Set<CopyHolderContacts> copyHolderContacts = new HashSet<CopyHolderContacts>( 0 );
    private Set<Contract> contracts = new HashSet<Contract>( 0 );
    private Set<CustomLicFieldValue> copyHolderCustomLicFieldValues = new HashSet<CustomLicFieldValue>( 0 );
    private List<XMLCustomField> customFields;

    public CopyrightHolder() {
    }

    public CopyrightHolder( String name, String address, String affiliation ) {
        this.name = name;
        this.address = address;
        this.affiliation = affiliation;
    }

    public CopyrightHolder( String name, String address, String affiliation,
            Set<CopyHolderDocuments> copyHolderDocuments, Set<CopyHolderContacts> copyHolderContacts,
            Set<Contract> contracts, Set<CustomLicFieldValue> customLicFieldValues ) {
        this.name = name;
        this.address = address;
        this.affiliation = affiliation;
        this.copyHolderDocuments = copyHolderDocuments;
        this.copyHolderContacts = copyHolderContacts;
        this.contracts = contracts;
        this.copyHolderCustomLicFieldValues = customLicFieldValues;
    }

    @XmlTransient
    public Long getIdCopyrightHolder() {
        return this.idCopyrightHolder;
    }

    public void setIdCopyrightHolder( Long idCopyrightholder ) {
        this.idCopyrightHolder = idCopyrightholder;
    }

    @XmlAttribute
    public String getName() {
        return this.name;
    }

    public void setName( String name ) {
        this.name = name;
    }

    @XmlElement(name="Address", namespace="http://www.example.org/copyrightholder")
    public String getAddress() {
        return this.address;
    }

    public void setAddress( String address ) {
        this.address = address;
    }

    @XmlAttribute    
    public String getAffiliation() {
        return this.affiliation;
    }

    public void setAffiliation( String affiliation ) {
        this.affiliation = affiliation;
    }

    @XmlElementWrapper(name="Documents")
    @XmlElement(name="Document")    
    public Set<CopyHolderDocuments> getCopyHolderDocuments() {
        return this.copyHolderDocuments;
    }

    public void setCopyHolderDocuments( Set<CopyHolderDocuments> copyHolderDocuments ) {
        this.copyHolderDocuments = copyHolderDocuments;
    }

    @XmlElementWrapper(name="Contacts", namespace="http://www.example.org/common")
    @javax.xml.bind.annotation.XmlElement(name="Contact", namespace="http://www.example.org/common")
    public Set<CopyHolderContacts> getCopyHolderContacts() {
        return this.copyHolderContacts;
    }

    public void setCopyHolderContacts( Set<CopyHolderContacts> copyHolderContacts ) {
        this.copyHolderContacts = copyHolderContacts;
    }

    @XmlTransient    
    public Set<Contract> getContracts() {
        return this.contracts;
    }

    public void setContracts( Set<Contract> contracts ) {
        this.contracts = contracts;
    }

    @XmlTransient
    public Set<CustomLicFieldValue> getCopyHolderCustomLicFieldValues() {
        return this.copyHolderCustomLicFieldValues;
    }

    public void setCopyHolderCustomLicFieldValues( Set<CustomLicFieldValue> customLicFieldValues ) {
        this.copyHolderCustomLicFieldValues = customLicFieldValues;
    }

    @Transient
    @XmlElementWrapper(name="custom-fields")
    @XmlElement(name="custom-field")
    public List<XMLCustomField> getCustomFields() {
        return customFields;
    }

    public void setCustomFields(List<XMLCustomField> customFields) {
        this.customFields = customFields;
    }

}

我发送的XML:

<?xml version="1.0" encoding="UTF-8"?>
<CopyrightHolder affiliation="ingest" name="ingest" xmlns="http://www.example.org/copyrightholder" xmlns:cm="http://www.example.org/common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/copyrightholder copyrightholder2.xsd ">
  <Address>Address</Address>
  <Contacts>
    <cm:Contact email="ingest2@ingest.com" name="ingest" notify="true" phoneMobile="" phoneOffice="" phoneWork=""/>
  </Contacts>
  <Documents>
    <cm:FilePath>cm:FilePath</cm:FilePath>
  </Documents>
  <CustomFields>
    <cm:CustomField name="ingest" order="0" required="false" type="Alphanumeric" value=""/>
  </CustomFields>
</CopyrightHolder>

的XSD:

common.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.example.org/common" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cm="http://www.example.org/common">
    <xsd:complexType name="contact">
        <xsd:sequence></xsd:sequence>

        <xsd:attribute name="name" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"></xsd:minLength>
                    <xsd:maxLength value="50"></xsd:maxLength>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="email" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:pattern value="\w+@\w+"></xsd:pattern>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="phoneOffice" type="xsd:string" use="optional"></xsd:attribute>
        <xsd:attribute name="phoneWork" type="xsd:string" use="optional"></xsd:attribute>
        <xsd:attribute name="phoneMobile" type="xsd:string" use="optional"></xsd:attribute>
        <xsd:attribute name="notify" type="xsd:boolean" use="optional"></xsd:attribute>

    </xsd:complexType>

    <xsd:complexType name="documents">
        <xsd:sequence>
            <xsd:element name="FilePath" type="xsd:string" minOccurs="1" maxOccurs="unbounded">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="custom-field">
        <xsd:sequence></xsd:sequence>
        <xsd:attribute name="name" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"></xsd:minLength>
                    <xsd:maxLength value="50"></xsd:maxLength>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="required" type="xsd:boolean" use="optional" default="false">
        </xsd:attribute>
        <xsd:attribute name="type" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="Alphanumeric"></xsd:enumeration>
                    <xsd:enumeration value="Date"></xsd:enumeration>
                    <xsd:enumeration value="Number"></xsd:enumeration>
                    <xsd:enumeration value="Percentage"></xsd:enumeration>
                    <xsd:enumeration value="Text"></xsd:enumeration>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="order" type="xsd:int" use="optional"></xsd:attribute>
        <xsd:attribute name="value" type="xsd:string" use="required"></xsd:attribute>
    </xsd:complexType>

     <xsd:complexType name="contacts">
        <xsd:sequence>
            <xsd:element name="Contact" type="cm:contact" minOccurs="1" maxOccurs="unbounded"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

      <xsd:complexType name="custom-fields">
        <xsd:sequence>
            <xsd:element name="CustomField" minOccurs="1" maxOccurs="unbounded" type="cm:custom-field"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

copyrightholder.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.example.org/copyrightholder" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.org/copyrightholder" xmlns:cm="http://www.example.org/common">


    <xsd:import namespace="http://www.example.org/common" schemaLocation="common.xsd"></xsd:import>
    <xsd:complexType name="CopyrightHolder">
        <xsd:sequence>

            <xsd:element name="Address" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="Contacts" type="cm:contacts" minOccurs="0" maxOccurs="1">
            </xsd:element>
            <xsd:element name="Documents" type="cm:documents" minOccurs="0" maxOccurs="1">
            </xsd:element>
            <xsd:element name="CustomFields" type="cm:custom-fields" minOccurs="0" maxOccurs="1">
            </xsd:element>
        </xsd:sequence>


        <xsd:attribute name="name" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"></xsd:minLength>
                    <xsd:maxLength value="50"></xsd:maxLength>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="affiliation" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"></xsd:minLength>
                    <xsd:maxLength value="50"></xsd:maxLength>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>

    <xsd:element name="CopyrightHolder" type="CopyrightHolder"></xsd:element>
</xsd:schema>

1 个答案:

答案 0 :(得分:2)

您的命名空间搞砸了。例如:

@XmlElementWrapper(name="Contacts", namespace="http://www.example.org/common")
@javax.xml.bind.annotation.XmlElement(name="Contact", namespace="http://www.example.org/common")
public Set<CopyHolderContacts> getCopyHolderContacts() {
    return this.copyHolderContacts;
}

在您的XML文档中,Contacts包装器元素具有http://www.example.org/copyrightholder命名空间。

尝试将其更改为

@XmlElementWrapper(name="Contacts", namespace="http://www.example.org/copyrightholder")
@XmlElement(name="Contact", namespace="http://www.example.org/common")

与其他系列类似。