2

XMLを使用して以下の形式のファイルを生成する必要があります。これには、固定可変JAXB2の両方のxml コンテンツが含まれています。

制約とは何ですか?

可変XML部分のコンテンツは、固定コンテンツに埋め込む必要がある5 つの異なるXML schema(それを生成するために 5 つの異なる Java クラスを実装する予定です) のいずれかである必要があります。JAXB2.0XML

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 metadataBaseUserType変数 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>

私の質問は:

  1. なぜ は、マーシャリングされたコンテンツを親コンテンツJAXB marshallersに埋め込むことができませんでした。CustomXMLAdapter(UserInfo.class)
  2. これを単純に行うための代替オプションはありますか?JAXB
  3. の指定方法BoundType_ コンテンツを親クラスのマーシャリングに埋め込むために指定する特定のタイプはありますか?ValueTypeXMLAdapter
4

1 に答える 1