Java JAXB2绑定工作不正常

Java JAXB2绑定工作不正常,java,jaxb,Java,Jaxb,考虑以下绑定(代码段): 以及以下XML模式(代码段): 和以下输入: <OPERAND> <CONSTANT>Test1</CONSTANT> </OPERAND><OPERATOR>myOperator</OPERATOR> <OPERAND> <CONSTANT>Test2</CONSTANT> </OPERAND> 测试1 肌肉操作者 测试2 有人能解释为

考虑以下绑定(代码段):


以及以下XML模式(代码段):


和以下输入:

<OPERAND>
<CONSTANT>Test1</CONSTANT>
</OPERAND><OPERATOR>myOperator</OPERATOR>
<OPERAND>
<CONSTANT>Test2</CONSTANT>
</OPERAND>

测试1
肌肉操作者
测试2
有人能解释为什么“GetSecondOperator”返回null,为什么“GetFirstOperator”实际上包含“Test2”的常量值吗

使用:
-JAXB 2.2.4u1
-Java 1.6.0_23
-ApacheMaven 3.0.1
-maven-jaxb2-plugin版本0.8.0

编辑:JAXB生成(已删除访问器/变异器的JavaDoc:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="OPERAND" type="{}OPERANDType"/>
 *         &lt;element name="OPERATOR" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="OPERAND" type="{}OPERANDType"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "firstOperand",
    "operator",
    "secondOperand"
})
@XmlRootElement(name = "CONDITION")
public class CONDITION {

    @XmlElement(name = "OPERAND", required = true)
    protected OPERANDType firstOperand;
    @XmlElement(name = "OPERATOR", required = true)
    protected String operator;
    @XmlElement(name = "OPERAND", required = true)
    protected OPERANDType secondOperand;

    public OPERANDType getFirstOperand() {
        return firstOperand;
    }

    public void setFirstOperand(OPERANDType value) {
        this.firstOperand = value;
    }

    public String getOPERATOR() {
        return operator;
    }

    public void setOPERATOR(String value) {
        this.operator = value;
    }

    public OPERANDType getSecondOperand() {
        return secondOperand;
    }

    public void setSecondOperand(OPERANDType value) {
        this.secondOperand = value;
    }
}
import javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.XmlType;
/**
*匿名复杂类型的Java类。
* 
*以下架构片段指定此类中包含的预期内容。
* 
* 
*complexType>
*complexContent>
*限制基数=”{http://www.w3.org/2001/XMLSchema}任何类型“>
*序列>
*element name=“OPERAND”type=“{}操作数类型”/>
*元素名称=“运算符”类型=”{http://www.w3.org/2001/XMLSchema}字符串“/>
*element name=“OPERAND”type=“{}操作数类型”/>
*/顺序>
*/限制>
*/complexContent>
*/complexType>
* 
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=),比例={
“第一个操作数”,
“操作员”,
“第二个操作数”
})
@XmlRootElement(name=“CONDITION”)
公共阶级状况{
@XmlElement(name=“OPERAND”,必需=true)
受保护操作数类型第一个操作数;
@xmlement(name=“OPERATOR”,required=true)
受保护字符串运算符;
@XmlElement(name=“OPERAND”,必需=true)
受保护操作数类型第二个操作数;
公共操作数类型GetFirstOperator(){
返回第一个操作数;
}
public void setFirstOperator(操作数类型值){
this.firstOperator=值;
}
公共字符串getOPERATOR(){
返回运算符;
}
公共void设置运算符(字符串值){
这个操作符=值;
}
公共操作数类型GetSecondOperator(){
返回第二个操作数;
}
public void setSecondOrand(操作数类型值){
this.second操作数=值;
}
}

您的绑定导致XJC生成了无法工作的代码。您最终得到了两个绑定到名为
操作数
的元素的Java字段,位,因为Java类中没有隐式定义的字段顺序(源代码顺序没有任何意义),绑定到每个字段的数据将是不可预测的

默认情况下,我假设XJC生成了一个绑定到
条件
元素的Java
列表
。由于Java缺乏表达能力,这是绑定传入XML时唯一真正有效的配置


我建议您要么接受这种情况,并在运行时用自己的代码将运算符和操作数分离,要么尝试非标准JAXB实现,如,它具有增强的执行此类操作的能力。

查看绑定没有帮助。我们需要查看生成的代码。@skaffman:添加了生成的代码。让我来看看知道还有什么可以帮助你。我所做的是基于。避免列表确实是我想要的。因此,链接问题中的人所做的也被破坏了?我刚刚删除了此部分的绑定,并像以前一样使用列表,谢谢你的帮助!
<OPERAND>
<CONSTANT>Test1</CONSTANT>
</OPERAND><OPERATOR>myOperator</OPERATOR>
<OPERAND>
<CONSTANT>Test2</CONSTANT>
</OPERAND>
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="OPERAND" type="{}OPERANDType"/>
 *         &lt;element name="OPERATOR" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="OPERAND" type="{}OPERANDType"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "firstOperand",
    "operator",
    "secondOperand"
})
@XmlRootElement(name = "CONDITION")
public class CONDITION {

    @XmlElement(name = "OPERAND", required = true)
    protected OPERANDType firstOperand;
    @XmlElement(name = "OPERATOR", required = true)
    protected String operator;
    @XmlElement(name = "OPERAND", required = true)
    protected OPERANDType secondOperand;

    public OPERANDType getFirstOperand() {
        return firstOperand;
    }

    public void setFirstOperand(OPERANDType value) {
        this.firstOperand = value;
    }

    public String getOPERATOR() {
        return operator;
    }

    public void setOPERATOR(String value) {
        this.operator = value;
    }

    public OPERANDType getSecondOperand() {
        return secondOperand;
    }

    public void setSecondOperand(OPERANDType value) {
        this.secondOperand = value;
    }
}