java - Jaxb 解码 : not getting my collection elements

标签 java xml collections jaxb unmarshalling

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

我想生成一个带有 xml 的版权持有者实例。我创建了一个 http post 方法来发送 xml 并使用注释对其进行解码。为了生成 post 方法,我使用了一个名为 Poster 的 Firefox 插件。来自 CopyrightHolder 的所有集合都无法加载。 (PS:契约(Contract)集合未映射)。对 post 方法的调用有效,创建了版权所有者,但所有集合为空。我想我遗漏了一些注释。

感谢任何帮助。

类(class):

版权持有人联系人:

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

   }

版权持有人:

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>

版权持有人.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>

最佳答案

你的命名空间搞乱了。例如:

@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")

其他集合也类似。

关于java - Jaxb 解码 : not getting my collection elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10284502/

相关文章:

java - 基于 equals 方法的不同实现来计算列表中项目的频率

c# - 运算符 '??' 不能应用于类型 'System.DateTime' 的操作数

c# - 在 C# 中按值对 NameValueCollection 进行排序

java - 当设备缓慢移动或静止时 GPS 会波动

java - HashMap 和 TreeMap 有什么区别?

java - 如何在android中的图像上放置黑色透明

sql - fetchxml 脚本中的 case 语句

java - META-INF/services/java.sql.驱动程序文件

java - 与 Java 相比,Objective-C 中类级别方法的区别和好处是什么

sql - 使用 FOR XML 从 SQL Server 2008 R2 返回空字段或空字段作为 <element/>