2016-05-09 89 views
4

我目前正在其上使用以下contruct一個XSD:JAXB:生成固定值屬性定值

<xs:attribute name="listVersionID" type="xs:normalizedString" use="required" fixed="1.0"> 

雖然不是問題本身,這是相當惱人的工作,因爲此定義的固定值在xsd規範的版本之間增加,我們需要修改單獨的常量類中的值以保持它們的有效性,儘管xsd中的任何興趣都沒有改變。 xsd在別處維護,所以只是改變它是不行的。

因此我問自己閹有一個JAXB的插件或類似轉動固定值屬性插入常量的ala

@XmlAttribute(name = "listVersionID") 
@XmlJavaTypeAdapter(NormalizedStringAdapter.class) 
@XmlSchemaType(name = "normalizedString") 
protected final String listVersionID = "1.0"; 

,而不是僅僅

@XmlAttribute(name = "listVersionID") 
@XmlJavaTypeAdapter(NormalizedStringAdapter.class) 
@XmlSchemaType(name = "normalizedString") 
protected String listVersionID; 

必須手動填充。

有沒有人知道這樣的?

回答

3

是的,它可以通過自定義的jaxb綁定,它可以作爲codegen中的文件添加。

在jaxb綁定中,有屬性fixedAttributeAsConstantProperty。將其設置爲true,指示代碼生成器生成fixed屬性作爲java常量的屬性。

這有2種選擇:

1.通過全局綁定: 然後讓所有的屬性具有固定值的常量

<schema targetNamespace="http://stackoverflow.com/example" 
     xmlns="http://www.w3.org/2001/XMLSchema" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     jaxb:version="2.0"> 
    <annotation> 
    <appinfo> 
     <jaxb:globalBindings fixedAttributeAsConstantProperty="true" /> 
    </appinfo> 
    </annotation> 
    ... 
</schema> 

2.通過局部映射: 其中只定義了特定屬性上的fixedAttributeAsConstantProperty屬性。

<schema targetNamespace="http://stackoverflow.com/example" 
     xmlns="http://www.w3.org/2001/XMLSchema" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     jaxb:version="2.0"> 
    <complexType name="example"> 
     <attribute name="someconstant" type="xsd:int" fixed="42"> 
      <annotation> 
       <appinfo> 
        <jaxb:property fixedAttributeAsConstantProperty="true" /> 
       </appinfo> 
      </annotation> 
     </attribute> 
    </complexType> 
    ... 
</schema> 

兩個例子都應該導致:

@XmlRootElement(name = "example") 
public class Example { 
    @XmlAttribute 
    public final static int SOMECONSTANT = 42; 
} 
3

如果你不想修改你的模式,另一種選擇是使用外部綁定文件

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <jaxb:bindings schemaLocation="yourschema.xsd" node="/xs:schema"> 
    <jaxb:globalBindings fixedAttributeAsConstantProperty="true" /> 
    </jaxb:bindings> 

</jaxb:bindings> 

這相當於在他的回答中提出了@jmattheis。