私は、JAXB元帥はすでに解決に関する話題がたくさんあるけど、私は私の問題のために収まる任意の解決策を見つけることができません。私は、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を
これは、同じ名前を持つ私のプロジェクト内の特定のパッケージからクラスを使用する必要があります。
- JAXBが停止し、1から問題がマーシャルプロセスの後半で表示される前に、私のファイルの一部が作成されます。
誰かが私を助けることができるならば非常にいいだろう。あなたが私のファイルのより多くのスナップショットが必要な場合は、ちょうど私に尋ねます。私はここでそれを投稿することができます。
EDIT:
これは私のLocalizedTextクラスです
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クラスで行う唯一のことは、リストでそれを使用することです。次の例のように:
@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;
}
[Lorg.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText:マーシャルは、このクラスを使用しないでください
これはLocalizedTextをシリアル化しようとしているの配列があることを述べているJavaの内部表記です。配列は通常、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から問題がマーシャルプロセスの後半で表示される前に、私のファイルの一部が作成されます。
マーシャリングは、すべてのフィールド、次々通過します。それはそのプロセスの中に問題が発生した場合、それはよくして中止することがあります。