Каковы правильные привязки / настройки для полного преобразования XSD с <choice>и ref-элементами в POJO? - PullRequest
0 голосов
/ 18 января 2019

У меня есть 2 файла схемы XSD, которые я использовал XJC для преобразования в POJO. Когда я пытаюсь разобрать строки XML для классов, я обнаружил, что элементы ref, которые становятся @XmlElementRef, особенно в классах, содержащих списки (from), не разбираются полностью. Они ссылаются на правильные типы и значения, но не просто представляют себя. Я прочитал некоторые нотации в коде, утверждая, что некоторые из них @link для живых списков, а не снимков. Я, наконец, пытаюсь конвертировать не маршаллированный XML в JSON. Это текущее поведение (фрагмент):

.xsd

<xs:element name="ControlTransaction">
<xs:complexType>
  <xs:sequence>
    <xs:element ref="ixretail:ReasonCode"/>
    <xs:choice>
      <xs:element ref="dtv:SystemCycleType"/>
      <xs:element ref="ixretail:NoSale"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

ControlTransaction.java класс

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "reasonCode",
    "systemCycleTypeOrNoSale"
})
@XmlRootElement(name = "ControlTransaction")
public 

class ControlTransaction {

@XmlElement(name = "ReasonCode", required = true)
protected String reasonCode;
@XmlElementRefs({
    @XmlElementRef(name = "NoSale", namespace = "http://www.nrf-arts.org/IXRetail/namespace/", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "SystemCycleType", namespace = "http://www.datavantagecorp.com/xstore/", type = JAXBElement.class, required = false)
})
protected JAXBElement<String> systemCycleTypeOrNoSale;

/**
 * Gets the value of the reasonCode property.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getReasonCode() {
    return reasonCode;
}

/**
 * Sets the value of the reasonCode property.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setReasonCode(String value) {
    this.reasonCode = value;
}

/**
 * Gets the value of the systemCycleTypeOrNoSale property.
 * 
 * @return
 *     possible object is
 *     {@link JAXBElement }{@code <}{@link String }{@code >}
 *     {@link JAXBElement }{@code <}{@link String }{@code >}
 *     
 */

- IntelliJ показывает, как геттер и сеттер никогда не используются

Transaction.java - родительский элемент ControlTransaction

    public List<Object> getForeignCurrencyExchangeRateOrTenderExchangeOrTimeClockTransaction() {
    if (foreignCurrencyExchangeRateOrTenderExchangeOrTimeClockTransaction == null) {
        foreignCurrencyExchangeRateOrTenderExchangeOrTimeClockTransaction = new ArrayList<Object>();
    }
    return this.foreignCurrencyExchangeRateOrTenderExchangeOrTimeClockTransaction;
}

содержит только get

ОБРАЗЕЦ XML

 <ControlTransaction>
   <ReasonCode>Store Open</ReasonCode>
   <dtv:SystemCycleType>Store Open</dtv:SystemCycleType>
 </ControlTransaction>

Вывод JSON показывает значение, но не простое {"ключ": "значение"}

    "foreignCurrencyExchangeRateOrTenderExchangeOrTimeClockTransaction" : [ {
  "reasonCode" : "Store Open",
  "systemCycleTypeOrNoSale" : {
    "name" : "{http://www.datavantagecorp.com/xstore/}SystemCycleType",
    "declaredType" : "java.lang.String",
    "scope" : "javax.xml.bind.JAXBElement$GlobalScope",
    "value" : "Store Open",
    "nil" : false,
    "globalScope" : true,
    "typeSubstituted" : false
  }
} ],

Как я могу обеспечить, чтобы при отмене разбивки последующий JSON содержал пары k: v? Значения есть, а типы известны, но вывод слишком подробный. Это опция, которую можно добавить в файл привязок или что-то еще с логикой. В моих XSD слишком много примеров для создания пользовательских адаптеров, поэтому я надеюсь, что это можно исправить на этапе создания XJC, JAXB pojo. Заранее спасибо.

...