2011-11-13 12 views
1

JAXBに問題があります。 @XmlAnyAttribute(getter上)のメソッドがありますが、setter(JAXB RIを使用する場合は問題ありません)で動作しないようです。@XmlAnyAttributeとメソッドのバグ? (JAXB RIを使用)

簡体コード:マーシャリングのための素晴らしい

@XmlRootElement(name = "element") 
@XmlAccessorType(value = XmlAccessType.PUBLIC_MEMBER) 
public class Element 
{ 
    private Map<QName, String> convertedAttributes = new HashMap<QName, String>(); 

    private List<Attribute> attributes = new ArrayList<Attribute>(); 

    @XmlAnyAttribute 
    public Map<QName, String> getConvertedAttributes() throws Exception 
    { 
     if (attributes != null) 
     { 
      return new AttributeMapAdapter().marshal(attributes); 
     } 

     return new HashMap<QName, String>(); 
    } 

    public void setConvertedAttributes(Map<QName, String> convertedAttributes) 
    { 
     this.convertedAttributes = convertedAttributes; 
    } 

    @XmlTransient 
    public List<Attribute> getAttributes() 
    { 
     return attributes; 
    } 

    public void setAttributes(List<Attribute> attributes) 
    { 
     this.attributes = attributes; 
    } 
} 

この作品、そして私は、私が欲しいの出力を得ます。しかし、私がアンマーシャリングしようとすると、セッターに送られた値はありません。

フィールドに@XmlAnyAttributeアノテーションを移動しようとしましたが、正常に動作しますが、ゲッタでアダプテーションを実行できません。

バグのような感じですが、わかりません。何か案は?私はMac OS X(10.7.2)でJava 1.6を使用しています

+0

私は必要に応じてさらにコードを提供することができます。 – mortenoh

答えて

1

これはJAXB RIのバグではありません。問題はgetConvertedAttributes()メソッドにあります。以下は少しうまくいく:

public Map<QName, String> getConvertedAttributes() throws Exception 
{ 
    if(!convertedAttributes.isEmpty()) { 
     return convertedAttributes; 
    } 
    if (attributes != null) { 
     convertedAttributes = new AttributeMapAdapter().marshal(attributes); 
    } else { 
     convertedAttributes = new HashMap<QName, String>(); 
    } 
    return convertedAttributes; 
} 
+0

ありがとう、ありがとう.. – mortenoh

0

設定者はマップを再度アンマーシャリングする必要があります。したがって、あなたは他の方向のアダプタも必要です。

+0

私はその方向のマッパを持っています。しかし、convertedAttributesは常に空ですが、値は取得されません。フィールドに@XmlAnyAttributeを使用すると、値をアンマーシャリングできますが、メソッドでそれを使用すると機能しません。 – mortenoh

+0

@mortenohええ、あなたは正しいです、それは基本的なマップにアクセスするためにゲッターだけを使用します。返されたゲッターのマップを飾り付け、そこにputメソッドとgetメソッドをインターセプトする必要があります。私はあなたの現在のアダプタをマップインターフェイスを実装し、それを返すことを提案します。 – Omnaest

関連する問題