2014-10-02 91 views
0

我从xml模式生成java类,对于一个复杂类型,我希望jaxb使用现有类,为此我有一个外部绑定自定义文件。 自定义类被解组为,除了以外,该类型的单个属性永远不会填充到java类中。JAXB未将属性映射到“自定义”类

下面是类型/类Thing的问题演示。

如在模式中定义的事情是:

<xsd:complexType name="Thing"> 
    <xsd:sequence> 
    <xsd:element name="nameEl" type="xsd:string"/> 
    </xsd:sequence> 
    <xsd:attribute name="nameAttr" type="xsd:string" use="required"/> 
</xsd:complexType> 

和读取匹配xml文件是片段:

JAXBContext jc = JAXBContext.newInstance("jaxbtest"); 
Unmarshaller u = jc.createUnmarshaller(); 

// Make it validate against the instance schema 
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = sf.newSchema(new File("./sample.xsd")); 
u.setSchema(schema); 

Config config = (Config)u.unmarshal(new File("./sample.xml")); 

for (Thing thing : config.getThing()) { 
    System.out.println("nameAttr=[" + thing.getNameAttr() +"]"); 
    System.out.println("nameEl=[" + thing.getNameEl() +"]"); 
} 

阅读在此xml:

<m:config xmlns:m="test"> 
    <thing nameAttr="hello"> 
    <nameEl>goodbye</nameEl> 
    </thing> 
</m:config> 

使用由JAXB生成的Thing类(不使用自定义xjb),输出如预期的那样:

nameAttr=[hello] 
nameEl=[goodbye] 

使用它只是有干将& setter方法nameAttr & nameEl自定义事类,输出

nameAttr=[null] 
nameEl=[goodbye] 

自定义类很简单:

public class Thing { 
    private String nameEl; 
    private String nameAttr; 

    public String getNameEl() { 
     return nameEl; 
    } 
    public void setNameEl(String value) { 
     this.nameEl = value; 
    } 

    public String getNameAttr() { 
     return nameAttr; 
    } 
    public void setNameAttr(String value) { 
     this.nameAttr = value; 
    } 
} 

任何人都可以解释为什么“nameEL”元素和“nameAttr”属性的行为是不同的?

将自定义Thing与JAXB生成的东西进行比较唯一的区别是注释,当不从Java类生成模式时,我认为这不是必需的,并且显然不适用于包含的元素。

为了完整起见,XJB是:

<jxb:bindings 
    version="2.1" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"> 

    <jxb:bindings schemaLocation="sample.xsd"> 

    <jxb:bindings node="//xsd:complexType[@name='Thing']"> 
     <jxb:package name=""/> 
     <jxb:class ref="custom.Thing"/> 
    </jxb:bindings> 

    </jxb:bindings> 
</jxb:bindings> 

回答

0

嗯,你要真正去null的属性,而不是元素。

我的猜测是问题很简单。注释很重要:如果您不提供它们,那么您的属性将被视为@XmlElement - 默认情况下已注释。这就是为什么一个财产没有组织,另一个不是。

但是,如上所述,实际上您应该获得null的属性,而不是元素。你能重新检查吗?

这是布莱斯的relevant post

+0

这是我得到null的属性。 你说得对,将注释添加到自定义类中并没有什么用。 – bwldrd 2014-10-04 12:33:56

+0

我误解了xsd-> java类生成映射的本质:我认为在.xjb中定义映射的重点将避免编辑xsd或目标自定义java类,这两者都不需要了解其他,即。良好的解耦。出于兴趣,是否有另外一种实现映射到自定义类的机制?这是适配器吗? 聚苯乙烯 - 谢谢你麻烦回答我原来的问题。 – bwldrd 2014-10-04 12:38:15

相关问题