JAXB маршал объект неизвестного типа - PullRequest
0 голосов
/ 06 марта 2020

Возможно ли составить список объектов неизвестных типов? Код ниже - это один класс, который был создан из XML схемы. Этот класс имеет анонимный внутренний класс, который является объектом, и этот объект может быть списком неизвестных типов.

Когда я пытаюсь упорядочить это, я получаю ошибку:

javax . xml .bind.MarshalException - со связанным исключением: [com.sun.istack.internal.SAXException2: Ни один класс [Lorg.opcfoundation.ua.builtintypes.LocalizedText; ни один из ассоциированных суперклассов не известен в этом контексте. javax. xml .bind.JAXBException: Ни один из классов [Lorg.opcfoundation.ua.builtintypes.LocalizedText; ни один из ассоциированных суперклассов не известен этому контексту].

LocalizedText может быть одним из возможных типов для этого объекта, и я думаю, что JAXB выглядит в неправильном пакете в моем проекте.

<code>package databases.org.opcfoundation.ua._2011._03.uanodeset;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;


/**
 * <p>Java-Klasse für UAVariable complex type.
 * 
 * <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
 * 
 * <pre>
 * &lt;complexType name="UAVariable">
 *   &lt;complexContent>
 *     &lt;extension base="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}UAInstance">
 *       &lt;sequence>
 *         &lt;element name="Value" minOccurs="0">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;any processContents='lax' minOccurs="0"/>
 *                 &lt;/sequence>
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *         &lt;element name="Translation" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}TranslationType" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *       &lt;attribute name="DataType" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}NodeId" default="i=24" />
 *       &lt;attribute name="ValueRank" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}ValueRank" default="-1" />
 *       &lt;attribute name="ArrayDimensions" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}ArrayDimensions" default="" />
 *       &lt;attribute name="AccessLevel" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}AccessLevel" default="1" />
 *       &lt;attribute name="UserAccessLevel" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}AccessLevel" default="1" />
 *       &lt;attribute name="MinimumSamplingInterval" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}Duration" default="0" />
 *       &lt;attribute name="Historizing" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "UAVariable", propOrder = {"value", "translation"}) publi c класс UAVariable extends UAInstance {@XmlElement (name = "Value ") защищенное значение UAVariable.Value; @XmlElement (name = "Translation") защищенный список перевод; @XmlAttribute (name = "DataType") protected String dataType; @XmlAttribute (name = "ValueRank") защищенное целое число valueRank; @XmlAttribute (name = "ArrayDimensions") защищенный список arrayDimensions; @XmlAttribute (name = "AccessLevel") защищенный Long accessLevel; @XmlAttribute (name = "UserAccessLevel") защищено Long userAccessLevel; @XmlAttribute (name = "MinimumSamplingInterval") защищенный DoubleimumSamplingInterval; @XmlAttribute (name = "Historizing") защищенная логическая историзация; / ** * Ruft den Wert der value-Eigenschaft ab. * * @return * возможным объектом является * {@link UAVariable.Value} * * / publi c UAVariable.Value getValue () {возвращаемое значение; } / ** * Legt den Wert der value-Eigenschaft fest. * * @param value * допустимым объектом является * {@link UAVariable.Value} * * / publi c void setValue (UAVariable.Value value) {this.value = value; } / ** * Получает значение свойства перевода. * *

* Этот метод доступа возвращает ссылку на текущий список, * не снимок. Поэтому любые изменения, которые вы вносите в возвращаемый список *, будут присутствовать внутри объекта JAXB. * Вот почему нет метода set для свойства перевода. * *

* Например, чтобы добавить новый элемент, выполните следующие действия: *

     *    getTranslation().add(newItem);
     * 
* * *

* Объекты следующих типов разрешены в списке * {@link TranslationType} * * * / publi c List getTranslation () {if (translation == null) {translation = new ArrayList (); } вернуть this.translation; } / ** * Ruft den Wert der dataType-Eigenschaft ab. * * @return * возможным объектом является * {@link String} * * / publi c String getDataType () {if (dataType == null) {return "i = 24"; } else {return dataType; }} / ** * Legt den Wert der dataType-Eigenschaft fest. * * @param value * допустимым объектом является * {@link String} * * / publi c void setDataType (String value) {this.dataType = value; } / ** * Ruft den Wert der valueRank-Eigenschaft ab. * * @return * возможный объект: * {@link Integer} * * / publi c int getValueRank () {if (valueRank == null) {return -1; } else {return valueRank; }} / ** * Legt den Wert der valueRank-Eigenschaft Fest. * * @param value * допустимый объект: * {@link Integer} * * / publi c void setValueRank (Integer value) {this.valueRank = value; } / ** * Получает значение свойства arrayDimensions. * *

* Этот метод доступа возвращает ссылку на текущий список, * не снимок. Поэтому любые изменения, которые вы вносите в возвращаемый список *, будут присутствовать внутри объекта JAXB. * Вот почему нет метода set для свойства arrayDimensions. * *

* Например, чтобы добавить новый элемент, выполните следующие действия: *

     *    getArrayDimensions().add(newItem);
     * 
* * *

* Объекты следующих типов разрешены в списке * {@link String} * * * / publi c List getArrayDimensions () {if (arrayDimensions == null) {arrayDimensions = new ArrayList (); } вернуть this.arrayDimensions; } / ** * Ruft den Wert der accessLevel-Eigenschaft ab. * * @return * возможный объект: * {@link Long} * * / publi c long getAccessLevel () {if (accessLevel == null) {return 1L; } else {return accessLevel; }} / ** * Фестиваль «Доступ к уровню жизни». * * @param value * допустимый объект: * {@link Long} * * / publi c void setAccessLevel (Long value) {this.accessLevel = value; } / ** * Ruft den Wert der userAccessLevel-Eigenschaft ab. * * @return * возможный объект: * {@link Long} * * / publi c long getUserAccessLevel () {if (userAccessLevel == null) {return 1L; } else {return userAccessLevel; }} / ** * Фестиваль пользователя userAccessLevel-Eigenschaft fest. * * @param value * допустимый объект: * {@link Long} * * / publi c void setUserAccessLevel (Long value) {this.userAccessLevel = value; } / ** * Ruft den Wert derimumSamplingInterval-Eigenschaft ab. * * @return * возможный объект: * {@link Double} * * / publi c double getMinimumSamplingInterval () {if (imumSamplingInterval == null) {return 0.0D; } else {returnimumSamplingInterval; }} / ** * Фестиваль минимальной оценки минимальной выборки-Eigenschaft. * * @param value * допустимым объектом является * {@link Double} * * / publi c void setMinimumSamplingInterval (Double value) {this.minimumSamplingInterval = value; } / ** * Ruft den Wert der Historizing-Eigenschaft ab. * * @return * возможным объектом является * {@link Boolean} * * / publi c boolean isHistorizing () {if (historyizing == null) {return false; } else {вернуть историзацию; }} / ** * Legt den Wert der Historizing-Eigenschaft fest. * * @param value * допустимым объектом является * {@link Boolean} * * / publi c void setHistorizing (Boolean value) {this.historizing = value; } / ** *

Java -Классы для анонимного сложного типа. * *

Das folgende Schemafragment gibt den erwarteten Содержит в дизеле Klasse enthalten ist. * *

     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;any processContents='lax' minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = {"any"}) publi c stati c Значение класса {@XmlAnyElement (lax = true) охраняемый объект любой; / ** * Ruft den Wert der any-Eigenschaft ab. * * @return * возможным объектом является * {@link Element} * {@link Object} * * / publi c Object getAny () {return any; } / ** * Legt den Wert der any-Eigenschaft фестиваль. * * @param value * допустимым объектом является * {@link Element} * {@link Object} * * / publi c void setAny (Object value) {this.any = value; }}}

Решения, которые я до сих пор пробовал:

public static void storeInformationModel(UANodeSet uaNodeSet, String file) {

        File outputFile = new File(file);

        try {

            JAXBContext outputJaxbContext = JAXBContext.newInstance(
                    "databases.org.opcfoundation.ua._2011._03.uanodeset",
                    UANodeSet.class.getClassLoader()); // Set the specific package with all classes 

            Marshaller jaxbMarshaller = outputJaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(uaNodeSet, outputFile);

        } catch (JAXBException e) {
            logger.error(e.getLocalizedMessage());
        }

    }
public static void storeInformationModel(UANodeSet uaNodeSet, String file) {

        File outputFile = new File(file);

        try {

            JAXBContext outputJaxbContext = JAXBContext.newInstance(
                    ...
                    LocalizedText.class // include all classes which were created out of the xml schema
                    ...);
            Marshaller jaxbMarshaller = outputJaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(uaNodeSet, outputFile);

        } catch (JAXBException e) {
            logger.error(e.getLocalizedMessage());
        }

    }

И я также пытался безуспешно использовать @XmlSeeAlso, @XmlRootElement

...