2

次の設定で XStream エラーが発生します。私は狂っているに違いない。どうしたの?

リクエストクラス

@XStreamAlias("RequestTO")
public class RequestTO {

    @XStreamImplicit
    private List<SkuMerchTO> skuNumbers;
...
}

ネストされたオブジェクト クラス

@XStreamAlias("skuMerch")
public class SkuMerchTO {

    @XStreamAlias("skuNumber")
    @XStreamAsAttribute
    private Integer skuNumber;

    @XStreamAlias("dept")
    @XStreamAsAttribute
    private Short department;

    @XStreamAlias("class")
    @XStreamAsAttribute
    private Short cls;

    @XStreamAlias("subClass")
    @XStreamAsAttribute
    private Short subClass;
...
}

XML をオブジェクトにデコードする XStream コード:

XStream stream = new XStream();
stream.processAnnotations(SkuMerchTO.class);
stream.processAnnotations(RequestTO.class);
RequestTO request =  (RequestTO)stream.fromXML(requestXml);

XML 入力文字列:

<RequestTO>
     <skuMerch skuNumber="123456" dept="1" class="2" subClass="3"/>
     <skuMerch skuNumber="234567" dept="4" class="5" subClass="6"/>  
</RequestTO>

Stacktrace のエラー:
---- デバッグ情報 ----
メッセージ: 2 : 2
原因例外: com.thoughtworks.xstream.mapper.CannotResolveClassException
原因メッセージ: 2 : 2
クラス: [...]RequestTO
必須タイプ: [...]SkuMerchTO
パス: /RequestTO/skuNumberList/skuMerch
行番号: 3
. ------------------------------- -
com.thoughtworks.xstream.converters.ConversionException: 2 : 2 : 2 : 2
---- デバッグ情報 ----
メッセージ : 2 : 2
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : 2:2
クラス: [...]
RequestTO 必須タイプ:[..]SkuMerchTO
パス: /RequestTO/skuNumberList/skuMerch
行番号: 3
.-------------------- -----------

オブジェクトを作成して toXML を実行すると、次のようになります。

<RequestTO>
  <skuMerch skuNumber="0" dept="1" class="2" subClass="2"/>
  <skuMerch skuNumber="1" dept="1" class="2" subClass="2"/>
  <skuMerch skuNumber="2" dept="1" class="2" subClass="2"/>
</RequestTO>

編集: 陽気なことは、これを行う場合:

 stream.fromXML(stream.toXML(object));  

from XML 部分ではまだ失敗します。

4

1 に答える 1

3

指定された属性classは XStream にとって特別な意味を持ちます。この質問は、次のような方法で、この目的のために別の属性を使用するよう XStream に指示できることを示唆しています。

stream.aliasSystemAttribute("__class", "class");

これにより、XStream__classは「特別な」属性として使用さclassれ、通常の属性として扱われます。classまたは、どのオブジェクトに対してもXStream の魔法の処理が必要ないことがわかっている場合は、次のように言うことができます

stream.aliasSystemAttribute(null, "class");

この機能をまったく使用しないように指示します。

XStream アノテーション チュートリアルに従って、アノテーションでitemFieldName="skuMerch"使用する必要がある場合もあります。@XStreamImplicit

于 2012-12-10T15:21:42.103 に答える