Ошибка с @XmlAnyAttribute и методами? (с использованием JAXB RI)

#java #jaxb

#java #jaxb

Вопрос:

У меня проблема с моим JAXB. У меня есть метод с @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 в поле, и это работает нормально (но тогда я не могу выполнить адаптацию в getter).

Это вроде как похоже на ошибку, но я не уверен. Есть идеи? Я использую Java 1.6 в Mac OS X (10.7.2)

Комментарии:

1. При необходимости я могу предоставить больше кода.

Ответ №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;
}
  

Ответ №2:

Ваш установщик должен снова отменить разметку карты. Итак, вам нужен адаптер и для другого направления.

Комментарии:

1. У меня есть картограф для этого направления. Но convertedAttributes всегда пуст, он не получает никаких значений. Использование @XmlAnyAttribute в поле дает мне значения для отмены сопоставления, но использование его в методе не работает.

2. @mortenoh да, вы правы, для получения доступа к базовой карте будет использоваться только средство получения. Вам нужно будет украсить возвращаемую карту средства получения и перехватить там методы put и get. Я бы предложил сделать ваш текущий адаптер, реализующий интерфейс map и возвращающий его.