默认情况下,JAXB似乎无法设置固定的属性值。这是预期的行为,还是我做错了什么?
我有一个像xsd:
<element name="AccountCategory" type="tns:Integer"></element>
<xs:complexType name="Integer">
<xs:simpleContent>
<xs:extension base="xs:int">
<xs:attribute name="e-dtype" fixed="int"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
编组使用new生成的java对象:
<AccountCategory>5</AccountCategory>
爪哇:
com.sample.Integer val = new com.sample.Integer();
val.setValue(5);
parentObject.setAccountCategory(val);
我可以手动设置属性值,它可以正常工作。此外,如果我只是将其重置为自己的值,它也有效。好像marshaller在生成XML时没有使用get方法?
val.setEDtype(val.getEDtype());
结果
<AccountCategory e-dtype="int">5</AccountCategory>
下面生成的.java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Integer", propOrder = {
"value"
})
public class Integer {
@XmlValue
protected int value;
@XmlAttribute(name = "e-dtype")
@XmlSchemaType(name = "anySimpleType")
protected String eDtype;
/**
* Gets the value of the value property.
*
*/
public int getValue() {
return value;
}
/**
* Sets the value of the value property.
*
*/
public void setValue(int value) {
this.value = value;
}
/**
* Gets the value of the eDtype property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getEDtype() {
if (eDtype == null) {
return "int";
} else {
return eDtype;
}
}
/**
* Sets the value of the eDtype property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setEDtype(String value) {
this.eDtype = value;
}
答案 0 :(得分:2)
引用XML Schema Part 0 - 2.2.1 Occurrence Constraints:
fixed
属性用于属性和元素声明,以确保将属性和元素设置为特定值。例如,po.xsd
包含country
属性的声明,该声明使用fixed
值US
声明。此声明表示实例文档中country
属性的外观是可选的(use
的默认值为optional
),但如果属性确实出现,则其值必须为{ {1}},如果未显示该属性,架构处理器将提供值为US
的{{1}}属性。
因此,正如您所看到的,因为您的属性为country
,除非您提供值,否则不会生成该属性,但该值必须为US
才能符合架构。
致电optional
将为您提供默认/固定值,因为它应该,
如果没有设置,生成将省略属性,应该。
不,编组员没有使用int
方法,因为get
是get
。
答案 1 :(得分:1)
尝试使用jaxb绑定fixedAttributeAsConstantProperty,如here。
<schema targetNamespace="https://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>