XML
を使用して以下の形式のファイルを生成する必要があります。これには、固定と可変JAXB2
の両方のxml コンテンツが含まれています。
制約とは何ですか?
可変XML
部分のコンテンツは、固定コンテンツに埋め込む必要がある5 つの異なるXML schema
(それを生成するために 5 つの異なる Java クラスを実装する予定です) のいずれかである必要があります。JAXB2.0
XML
XML 形式:
<user_info>
<header> //Fixed XML Part
<msg_id>..</msg_id>
<type>...</type>
</header>
<user_type> // Variable XML content
// (userType : admin, reviewer, auditer, enduser, reporter)
........
</user_type>
</user_info>
何を試しましたか?
JAXB
上記のアノテーション付き Java クラスを作成しましたXML metadata
。BaseUserType
変数 XML 部分には、 5 つの異なる Classes によって拡張された共通の Parent クラス ( ) を使用しました<user_type>
。marshall(..)
を使用して操作をオーバーライドしようとしました@XmlJavaTypeAdapter
。(以下のように)
JAXB アノテーション付きクラス:
@XmlRootElement(name="user_info")
public class UserInfo {
private Header header; //reference to JAXB annotated Class Header.class
@XmlJavaTypeAdapter(value=CustomXMLAdapter.class)
private BaseUserType userType; // Base class - acts as a common Type
// for all 5 different UserType JAXB annotated Classes
// Getters setters here..
// Also tried to declare JAXB annotations at Getter method
}
カスタム XML アダプター クラス:
public class CustomXMLAdapter extends XmlAdapter<Writer, BaseInfo> {
private Marshaller marshaller=null;
@Override
public BaseInfo unmarshal(Writer v) throws Exception {
// Some Implementations here...
}
@Override
public Writer marshal(BaseInfo v) throws Exception {
OutputStream outStream = new ByteArrayOutputStream();
Writer strResult = new OutputStreamWriter(outStream);
if(v instanceof CustomerProfileRequest){
getMarshaller().marshal((CustomerProfileRequest)v, strResult );
}
return strResult;
}
private Marshaller getMarshaller() throws JAXBException{
if(marshaller==null){
JAXBContext jaxbContext = JAXBContext.newInstance(Admin.class, Reviewer.class, Enduser.class, Auditor.class, Reporter.class);
marshaller = jaxbContext.createMarshaller();
}
return marshaller;
}
}
私は今どこに苦労していますか?
エラーや警告に直面していませんXML
。生成されています(以下に示すように)。しかし、出力は期待されたものではありません。Variable XML 部分が Fixed 部分に正しく埋め込まれていません。
出力
<user_info>
<header>
<msg_id>100</msg_id>
<type>Static</type>
</header>
<user_type/> // Empty Element, even though we binded the value properly.
</user_info>
私の質問は:
- なぜ は、マーシャリングされたコンテンツを親コンテンツ
JAXB marshallers
に埋め込むことができませんでした。CustomXMLAdapter
(UserInfo.class)
- これを単純に行うための代替オプションはありますか?
JAXB
- の指定方法
BoundType
_ コンテンツを親クラスのマーシャリングに埋め込むために指定する特定のタイプはありますか?ValueType
XMLAdapter