Невозможно заставить работать простой XmlAdapter - PullRequest
2 голосов
/ 02 августа 2011

Я пытаюсь заставить XmlAdapter работать в HashMap, и я получаю исключение. Я очень внимательно следил за этой записью в блоге и много раз просматривал код, но не вижу проблемы.

Я использую последнюю версию org.eclipse.persistence.jaxb.JAXBContextFactory в качестве поставщика JAXB.

Вот пример моего XML:

<test>
  <myName>Paul</myName>
  <mappings>
    <entry key="man">manufacturer</entry>
    <entry key="prod">product</entry>
  </mappings>
<test>

Выполните действия, указанные в сообщении в блоге, упомянутом выше:

1. Определить Неповторимый Класс

Я пытаюсь отобразить java.util.HashMap.

2. Создайте эквивалентный класс, который сопоставим

public class MappingType
{
  public List<MappingEntryType> entry = new ArrayList<MappingEntryType>();
}

public class MappingEntryType
{
  @XmlAttribute
  public String key;
  @XmlValue
  public String value;
}

3. Создайте XmlAdapter для преобразования между не отображаемыми и отображаемыми объектами

public class MappingAdapter extends XmlAdapter<MappingType,
                                               HashMap<String, String>>
{
  @Override
  public HashMap<String, String> unmarshal(MappingType v> throws Exception
  {
    HashMap<String, String> hashMap = new HashMap<String, String>();
    for (MappingTypeEntry mappingEntry : v.entry)
    {
      hashMap.put(mappingEntry.key, mappingEntry.value);
    }
    return hashMap;
  }

  // marshal is here but I'm just working on unmarshalling now
}

4. Укажите XmlAdapter

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test")
public class TestEntity
{
  @XmlElement
  private String myName;

  @XmlJavaTypeAdapter(MappingAdapter.class)
  HashMap<String, String> mappings;

  // getters & setters omitted in a feeble attempt at brevity
}

Я добавил следующий шаг, который я называю 5. Трассировка стека

Exception [EclipseLink-3001](Eclipse Persistence Services-2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.ConversionException
ExceptionDescription: The object [mypackage.MappingType@145d424], of class
[class mypackage.MappingType],could not be converted to [class java.util.HashMap]
  at etc etc

Описание исключения очень ясное, но я не вижу, где я пытаюсь преобразовать MappingType в HashMap. Иногда ввод вопроса приводит меня к ответу, но не в этот раз.

Я уверен, что это что-то простое - если вы видите мою ошибку, пожалуйста, укажите на это!

Спасибо!

Кстати, Блог Блеза Дафана полон отличной информации о JAXB и MOXy, которую стоит проверить.

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Я понял, как решить проблему, даже если я не понимаю, что происходит.

Я использую среду Spring в этом проекте, и мой класс XmlAdapter был помечен как @Component.Удаление этой аннотации сделало код прекрасно работающим.По какой-то причине мой адаптер, управляемый Spring, не позволил моему провайдеру JAXB использовать класс для демонтажа моего XML.

0 голосов
/ 06 июня 2012

Вы можете обратиться к официальной документации для XmlAdapter .Они привели тот же пример.

...