Я знаю, что много вопросов, касающихся JAXB Marshal, уже решены, но я не могу найти решения, подходящего для моей проблемы. Я пытаюсь собрать объект в файл xml. Часть этого файла создается, но jaxb каждый раз останавливается на одной и той же позиции с ошибкой:
com.sun.istack.internal.SAXException2: Ни один из классов [Lorg.eclipse .milo.opcua.stack.core.types.builtin.LocalizedText; ни один из ассоциированных суперклассов не известен этому контексту
Функция, в которой создается выходной файл:
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",
databases.org.opcfoundation.ua._2011._03.uanodeset.UANodeSet.class.getClassLoader());
Marshaller jaxbMarshaller = outputJaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(uaNodeSet, outputFile);
jaxbMarshaller.marshal(uaNodeSet, System.out);
} catch (JAXBException e) {
logger.error(e.getLocalizedMessage());
}
}
Вот часть моего выходного файла:
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=19288</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=6728</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=18176</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=18177</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=18192</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=18194</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=6027</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=6022</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=6117</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=15196</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=6170</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=1;i=15200</Reference>
<Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=5;s=UpdateInterval</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">ns=0;i=62</Reference>
</References>
</UAVariableType>
<UAVariable DataType="NodeId{ns=0, id=21}" ValueRank="1" ArrayDimensions="0" AccessLevel="1" UserAccessLevel="1" MinimumSamplingInterval="-1.0" Historizing="false" NodeId="ns=0;i=7591" BrowseName="0:EnumStrings" WriteMask="0" UserWriteMask="0">
<DisplayName>EnumStrings</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition
Меня смущают две вещи:
- Маршал не должен использовать этот класс: [Lorg.eclipse.milo.opcua.stack.core .types.builtin.LocalizedText
В моем проекте должен использоваться класс из указанного пакета c с таким же именем.
Часть моего файла создается до остановки JAXB, и проблема с 1. появляется позже в процессе маршала.
Было бы очень хорошо, если бы кто-нибудь мог мне помочь. Если вам нужно больше снимков моих файлов, просто спросите меня. Я могу опубликовать это здесь.
РЕДАКТИРОВАТЬ:
Это мой класс LocalizedText
<code>package databases.org.opcfoundation.ua._2011._03.uanodeset;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;
/**
* <p>Java-Klasse für LocalizedText complex type.
*
* <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
*
* <pre>
* <complexType name="LocalizedText">
* <simpleContent>
* <extension base="<http://www.w3.org/2001/XMLSchema>string">
* <attribute name="Locale" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}Locale" default="" />
* </extension>
* </simpleContent>
* </complexType>
*
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "LocalizedText", propOrder = {"value"}) publi c class LocalizedText {@XmlValue protected String value; @XmlAttribute (name = "Locale") защищенная строковая локаль; / ** * Ruft den Wert der value-Eigenschaft ab. * * @return * возможным объектом является * {@link String} * * / publi c String getValue () {return value; } / ** * Legt den Wert der value-Eigenschaft fest. * * @param value * допустимым объектом является * {@link String} * * / publi c void setValue (String value) {this.value = value; } / ** * Ruft den Wert der locale-Eigenschaft ab. * * @return * возможным объектом является * {@link String} * * / publi c String getLocale () {if (locale == null) {return ""; } else {return locale; }} / ** * Legt den Wert der locale-Eigenschaft fest. * * @param value * допустимым объектом является * {@link String} * * / publi c void setLocale (String value) {this.locale = value; }}
Единственное, что я делаю с моим классом LocalizedText, это использую его в списке. Как в следующем примере:
@XmlSeeAlso({
UAType.class,
UAInstance.class
})
public class UANode {
@XmlElement(name = "DisplayName")
protected List<LocalizedText> displayName;
@XmlElement(name = "Description")
protected List<LocalizedText> description;
@XmlElement(name = "Category")
protected List<String> category;
Единственный способ получить доступ к списку:
public List<LocalizedText> getDisplayName() {
if (displayName == null) {
displayName = new ArrayList<LocalizedText>();
}
return this.displayName;
}