在编组期间未设置JAXB固定属性

时间:2015-10-09 06:28:20

标签: java xml xsd jaxb

默认情况下,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;
}

2 个答案:

答案 0 :(得分:2)

引用XML Schema Part 0 - 2.2.1 Occurrence Constraints

  

fixed属性用于属性和元素声明,以确保将属性和元素设置为特定值。例如,po.xsd包含country属性的声明,该声明使用fixedUS声明。此声明表示实例文档中country属性的外观是可选的(use的默认值为optional),但如果属性确实出现,则其值必须为{ {1}},如果未显示该属性,架构处理器将提供值为US的{​​{1}}属性。

因此,正如您所看到的,因为您的属性为country,除非您提供值,否则不会生成该属性,但该值必须为US才能符合架构。

致电optional将为您提供默认/固定值,因为它应该
如果没有设置,生成将省略属性,应该

不,编组员没有使用int方法,因为getget

答案 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>