Jaxb:为固定值属性

时间:2016-05-09 07:30:33

标签: java xsd jaxb wsdl2java

我目前正在使用xsd,它使用以下结构:

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

虽然本身没有问题,但使用起来相当烦人,因为这个定义的固定值在xsd规范的发行版之间增加,我们需要修改单独的常量类中的值以使它们保持有效,尽管xsd中任何有趣的东西都没有改变。 xsd在其他地方维护,所以只是改变它是没有选择的。

因此我问自己是否有一个jaxb-plugin或类似的将固定值属性转换为常量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;

必须手动填充。

有人知道吗?

2 个答案:

答案 0 :(得分:3)

是的,可以通过自定义jaxb绑定,可以在codegen中添加为文件。

在jaxb绑定中,有fixedAttributeAsConstantProperty - 属性。将此设置为true,指示代码生成器生成fixed属性为java-constants的属性。

有两种选择:

<强> 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;
}

答案 1 :(得分: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在答案中提出的建议。