JAXB Marshal создает часть файла до возникновения ошибки - PullRequest
0 голосов
/ 05 марта 2020

Я знаю, что много вопросов, касающихся 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

Меня смущают две вещи:

  1. Маршал не должен использовать этот класс: [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>
 * &lt;complexType name="LocalizedText">
 *   &lt;simpleContent>
 *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
 *       &lt;attribute name="Locale" type="{http://opcfoundation.org/UA/2011/03/UANodeSet.xsd}Locale" default="" />
 *     &lt;/extension>
 *   &lt;/simpleContent>
 * &lt;/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;
}

1 Ответ

0 голосов
/ 05 марта 2020

Маршал не должен использовать этот класс: [Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText

Это Java - внутренний запись, которая говорит, что существует массив LocalizedText, пытающийся быть сериализованным. Массивы обычно имеют определенные классы, которые JVM использует для внутреннего управления ими:

jshell> Object foo=new Object[4];
foo ==> Object[4] { null, null, null, null }

jshell> foo.getClass().toString()
$10 ==> "class [Ljava.lang.Object;"  <<<--- this is such a class

Массивы могут иметь проблемы при сортировке. Из-за этого многие люди вместо этого используют коллекции.

Примеры того, как сериализовать списки, можно найти здесь . Возможно, списки спасут вас от вашей проблемы.

Может быть, простая аннотация @XmlRootElement в LocalizedText поможет вам.

Часть моего файла создается до того, как JAXB остановится и проблема из 1. появляется позже в процессе маршала.

Маршаллинг проходит через все поля, одно за другим. Если он сталкивается с проблемой в своем процессе, он вполне может прервать его.

...