#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 и возвращающий его.