« S2DxoとJAXB2.0 その2 | Main | S2DxoとJAXB2.0 その4 »

2007.07.18

S2DxoとJAXB2.0 その3

 S2DxoとJAXB2.0の組み合わせで、Unmarshal(XMLテキスト→オブジェクト)に関してはとりあえずは動いたので次はその逆のMarshal処理。

 何も考えず、S2Container経由で取得したオブジェクトをMarshalした場合、

Marshaller marshaller = context.createMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(entity, writer);
writer.flush();
System.out.println(writer.toString());

以下のような例外がでて失敗してしまいます。
[com.sun.istack.internal.SAXException2: unable to marshal type "test.HogeEntity$$EnhancedByS2AOP$$124111a" as an element because it is missing an @XmlRootElement annotation]

 これは、

  • Marshal処理の際は@XmlRootElementを基準に処理する。
  • @XmlRootElementアノテーションは@Inheritedアノテーションが指定されていない。
  • InterTypeを適用した「サブクラス」には@XmlRootElementが指定されていない状態となる。

    ことに起因していると思われます。

  •  でも、以下のような感じで書けば、とりあえずは回避可能なようで。

    Marshaller marshaller = context.createMarshaller();
    JAXBElement<Object> element =
     new JAXBElement<Object>(
      new QName("HogeEntity"),
      (Class<Object>)entity.getClass(),
      entity);
    StringWriter writer = new StringWriter();
    marshaller.marshal(element, writer);
    writer.flush();
    System.out.println(writer.toString());

     QNameを指定するところは、本当はもっとじっくり考えるべきだと思います(^^; 理想型(?)は、親クラスを取得し、そこの@XmlRootElementアノテーションを取得。そこにnameがセットされている場合はそのnameを元にQNameを構築、といった感じになるのではないかと。

    #無理矢理InterTypeを適用しようとせず、setter/getterを書いてしまった方が楽かもしれませんが、そこは気にしない(笑)。

    |

    « S2DxoとJAXB2.0 その2 | Main | S2DxoとJAXB2.0 その4 »

    Java」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack

    TrackBack URL for this entry:
    http://app.cocolog-nifty.com/t/trackback/3959/15796659

    Listed below are links to weblogs that reference S2DxoとJAXB2.0 その3:

    « S2DxoとJAXB2.0 その2 | Main | S2DxoとJAXB2.0 その4 »