JAXB类型问题

我有一个看起来像这样的xsd(片段):

                       

出于某种原因,这是生成的Java代码:

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "IDType", propOrder = { "fileID" }) public class PatientIDType { @XmlElementRefs({ @XmlElementRef(name = "FileED", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "IDNumber1", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "Number", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "PNumber", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "SS", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "Plaer", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "Prior", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "BIN", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class), @XmlElementRef(name = "Mutual", namespace = "http://www.surescripts.com/messaging", type = JAXBElement.class) }) protected List<JAXBElement> fileID; /** * Gets the value of the fileID property. * * 

* This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a set method for the fileID property. * *

* For example, to add a new item, do as follows: *

 * getFileID().add(newItem); * 

* * *

* Objects of the following type(s) are allowed in the list * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } * {@link JAXBElement }{@code } */ public List<JAXBElement> getFileID() { if (fileID == null) { fileID = new ArrayList<JAXBElement>(); } return this.fileID; }

为什么类生成这样的,而不是某种字符串数组? 我真的不想每次想要创建东西时都要创建JAXBElements吗?

我怎样才能为每个只表示字符串或类似内容的类型生成类?

提前致谢,

伊恩

生成此代码是因为您的复杂类型IDType包含maxOccurrence大于1的选项,此处:

此列表的内容是具有不同名称类型相同的元素。 这在标准的面向对象模型中没有等价物。 然后JAXB使用JAXBElement类来解决这个问题: JAXBElement包装一个包含数据的简单对象并为其分配一个QName

因此,您可以从此列表中读取并通过提供以下内容明确地写入列表:

  • 数据对象(在您的情况下为String,因为String的所有限制都表示为Java String)
  • 一个JAXBElementgetValue()方法返回字符串

JAXB规范包含了如何处理重复选择和重复序列的相当详细和相当复杂的解释。 请注意,如果序列包含不同类型的对象以及不同的名称,则最终将使用List

这是一个很长的解释,现在这里有一些选择:

  • 如果您可以修改架构,请在8个项目周围放置一个包装元素,例如“Wrapper”。 包装器将包含单个元素选择; 然后使IDType包含一系列Wrapper元素,其中minOccurs = 1且maxOccurs = 2。
  • 创建一些帮助函数来快速创建JAXBElements。 JAXB在您的目标包中放置了一个可以帮助您的Factory类 – 例如,它包含对Schema名称空间的引用等。

你的ObejctFActory类应该有thosr值的createMethod,类似于

 @XmlElementDecl(namespace = "http://www.surescripts.com/messaging", name = "SocialSecurity", scope = PatientIDType.class) public JAXBElement createPatientIDTypeSocialSecurity(String value) { return new JAXBElement(_PayerIDTypeSocialSecurity_QNAME, String.class, PatientIDType.class, value); } 

如果您正在使用Sun JAXB实现,则可以尝试使用xjc:simple模式进行编译。 有关示例,请参阅有关简化绑定的文档。 它应该转

 public class PatientIDType { protected List> fileID; } 

在…

 public class PatientIDType { String fileID; ... } 

您需要使用绑定自定义文件编译模式。 有关如何操作的示例,请参阅Kohsuke的博客 。