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
有两件事让我感到困惑:
- 元帅不应该使用这个class:
[Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText
它应该使用我的项目中具有相同名称的特定包中的 class。
- 我的文件的一部分是在 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>
* <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>
* </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.
编组遍历所有字段,一个接一个。如果它在其进程中遇到问题,它可能会中止。
我知道有很多关于 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
有两件事让我感到困惑:
- 元帅不应该使用这个class: [Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText
它应该使用我的项目中具有相同名称的特定包中的 class。
- 我的文件的一部分是在 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>
* <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>
* </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.
编组遍历所有字段,一个接一个。如果它在其进程中遇到问题,它可能会中止。