Возможно ли составить список объектов неизвестных типов? Код ниже - это один класс, который был создан из 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>
* <complexType name="UAVariable">
* <complexContent>
* <extension base="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}UAInstance">
* <sequence>
* <element name="Value" minOccurs="0">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <any processContents='lax' minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </element>
* <element name="Translation" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}TranslationType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* <attribute name="DataType" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}NodeId" default="i=24" />
* <attribute name="ValueRank" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}ValueRank" default="-1" />
* <attribute name="ArrayDimensions" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}ArrayDimensions" default="" />
* <attribute name="AccessLevel" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}AccessLevel" default="1" />
* <attribute name="UserAccessLevel" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}AccessLevel" default="1" />
* <attribute name="MinimumSamplingInterval" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}Duration" default="0" />
* <attribute name="Historizing" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
* </extension>
* </complexContent>
* </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. * *
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <any processContents='lax' minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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