« 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


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

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