我是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>
答案 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")
与其他系列类似。