我目前正在使用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;
必须手动填充。
有人知道吗?
答案 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在答案中提出的建议。