@XmlAnyAttribute和方法有什么问题? (使用JAXB RI)

时间:2011-11-13 20:06:43

标签: java jaxb

我的JAXB有问题。我有一个带@XmlAnyAttribute的方法(在我的getter上),但它似乎不适用于setter(如果重要的话,使用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;
    }
}

这项工作非常适合编组,我得到了我想要的输出。但是当我尝试解组它时,它没有发送给setter的值。

我尝试将@XmlAnyAttribute注释移动到该字段,它工作正常(但我不能在getter中进行调整)。

它有点像一个bug,但我不确定。有任何想法吗?我在Mac OS X上使用Java 1.6(10.7.2)

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你的二传手必须再次解组地图。所以你需要一个适配器用于另一个方向。