2012-10-15 19 views
5

可能重複:
jaxb xjc mapping to existing domain objectsJAX-B - 如何架構元素映射到現有的Java類

我使用JAX-B以生成一個XML架構的Java類。

我的模式中有一個元素,我想綁定到存在於我的項目中的Java類。我的綁定是在.xjb文件中完成的。我嘗試了幾種方法,但無法獲得任何工作。

這可能嗎? 如果是這樣,怎麼樣?

這裏是我的問題的一個小例子:

我現有的Java類:

package com.existing; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Existing { 
    private String prop; 
    public String getProp() { return prop; } 
    public void setProp(String prop) { this.prop = prop; } 
} 

我的架構:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.baloiselife.com/xpression/policy" 
    xmlns="http://www.baloiselife.com/xpression/policy" > 

<xs:element name="root_node"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="some_other_propery" type="xs:string"/> 
     <!-- I want this element to map onto my existing Java class --> 
     <xs:element name="special_element" type="existing_type" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<!-- I want this element to be ignored, and instead my Java class used --> 
<xs:complexType name="existing_type"> 
    <xs:sequence> 
    <xs:element name="prop" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

所以任何想法就是我結合應該是什麼? 我嘗試使用jxb:class設置,但無法讓它工作。 我的最終結果有兩個要求:

  1. 的ExistingType類是從架構
  2. 的根節點類有現有類型的元素,它映射到現有的Java類產生

回答

6

您可以使用外部綁定文件來配置XJC以執行您想要的操作。

binding.xjb

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

    <jxb:bindings schemaLocation="yourSchema.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='existing_type']"> 
      <jxb:class ref="com.existing.Existing"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

XJC呼叫

xjc -d outputDir -b binding.xjb yourSchema.xsd 
+1

感謝布萊斯。它看起來像ref屬性添加了2.1 jxb模式,並且我的IDE使用了一個較舊的...因此我沒有看到該選項!現在一切都很好。 –