2012-01-29 2 views
1

Рассмотрим следующие привязок (сниппет):JAXB 2 привязок не работает должным образом

<jaxb:bindings node="//xsd:element[@name='CONDITION']/xsd:complexType/xsd:sequence/xsd:element[@name='OPERAND'][position()=1]"> 
    <jaxb:property name="firstOperand"/> 
</jaxb:bindings> 

<jaxb:bindings node="//xsd:element[@name='CONDITION']/xsd:complexType/xsd:sequence/xsd:element[@name='OPERAND'][position()=2]"> 
    <jaxb:property name="secondOperand"/> 
</jaxb:bindings> 

И следующий XML-схема (фрагмент):

<xsd:element name="CONDITION"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="OPERAND" type="OPERANDType"/> 
       <xsd:element name="OPERATOR" type="xsd:string" /> 
       <xsd:element name="OPERAND" type="OPERANDType" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="OPERANDType"> 
     <xsd:choice> 
      <xsd:element name="SPECIALCONSTANT" type="xsd:string" /> 
      <xsd:element name="CONSTANT" type="xsd:string" /> 
     </xsd:choice> 
    </xsd:complexType> 

И следующий ввод:

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

Может кто-нибудь объяснить, почему «getSecondOperand» возвращает значение null, и почему «getFirstOperand» фактически con имеет значение CONSTANT «Test2»?

Использование:
- JAXB 2.2.4u1
- Java 1.6.0_23
- Apache Maven 3.0.1
- Maven-jaxb2-плагин версии 0.8.0

EDIT: 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; 
    } 
} 
+0

Видеть крепления не помогает. Нам нужно увидеть сгенерированный код. – skaffman

+0

@skaffman: Добавлен сгенерированный код. Дайте мне знать, если что-нибудь еще поможет. – AndrewBourgeois

ответ

2

креплениями вызвали XJC для генерации кода, который не будет работать Вы закончили с двумя полями Java, связанных с элементом называется OPERAND, бит, так как нет неявного, определенного порядка для полей в классе Java (порядок исходного кода ничего не значит), данные, привязанные к каждому полю, будут непредсказуемыми.

По умолчанию я предполагаю, что XJC сгенерировал Java List, связанный с элементом CONDITION. Это единственная конфигурация, которая будет действительно работать, когда дело доходит до привязки входящего XML из-за отсутствия выразительности Java.

Я предлагаю вам либо жить с этим, либо распутать оператор и операнды во время выполнения с помощью собственного кода, либо попробовать нестандартную реализацию JAXB, такую ​​как MOXy, которая имеет расширенные возможности для выполнения подобных задач.

+0

То, что я сделал, основано на http://stackoverflow.com/questions/868658/xjc-binding-customization-does-not-work-in-jaxb-2-1-3-it-works-in-jaxb-2. -0. Избежать списка действительно то, что я хочу. Итак, что же сделал человек в связанном вопросе? – AndrewBourgeois

+0

Я просто удалил привязки для этой части и работал со списком, как и раньше, спасибо за помощь! – AndrewBourgeois