JAXB Marshal 在错误发生之前创建文件的一部分

JAXB Marshal creates part of file before error occurs

我知道有很多关于 JAXB Marshal 的主题已经解决,但我没有找到适合我的问题的解决方案。 我正在尝试将对象编组到 xml 文件。此文件的一部分已创建,但 jaxb 每次都完全停在同一位置并出现错误:

com.sun.istack.internal.SAXException2: class [Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText 都不是;此上下文

也不知道任何关联的超classes

创建输出文件的函数:

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. 元帅不应该使用这个class: [Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText

它应该使用我的项目中具有相同名称的特定包中的 class。

  1. 我的文件的一部分是在 JAXB 停止之前创建的,来自 1. 的问题稍后出现在编组过程中。

如果有人能帮助我,那就太好了。如果您需要我的文件的更多快照,请问我。我可以post这里。


编辑:

这是我的 LocalizedText class

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>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LocalizedText", propOrder = {
    "value"
})
public class LocalizedText {

    @XmlValue
    protected String value;
    @XmlAttribute(name = "Locale")
    protected String locale;

    /**
     * Ruft den Wert der value-Eigenschaft ab.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getValue() {
        return value;
    }

    /**
     * Legt den Wert der value-Eigenschaft fest.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * Ruft den Wert der locale-Eigenschaft ab.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getLocale() {
        if (locale == null) {
            return "";
        } else {
            return locale;
        }
    }

    /**
     * Legt den Wert der locale-Eigenschaft fest.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setLocale(String value) {
        this.locale = value;
    }

}

我对 LocalizedText class 所做的唯一一件事就是在列表中使用它。就像下面的例子:

@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;
}

The marshal shouldn't use this class: [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()
 ==> "class [Ljava.lang.Object;"  <<<--- this is such a class

数组在编组时可能会出现问题。正因为如此,许多人改用集合。

可以找到有关如何序列化列表的示例 here。也许列表可以帮助您解决问题。

也许在 LocalizedText 上添加一个简单的 @XmlRootElement 注释就可以解决问题。

A part of my file is created before JAXB stops and the problem from 1. appears later in the marshal process.

编组遍历所有字段,一个接一个。如果它在其进程中遇到问题,它可能会中止。