2014-02-21 3 views
1

Я пытаюсь упорядочить и развязать HashMap в виде списка. Маршаллинг работает как в версиях Java (6u45, так и в 7u21), но unmarshalling записей в списке с Java 6u45 будет поставлять пустой myModels-HashMap. В Java 7u21 заполняется myModels-HashMap.JAXB unmarshalling list Java 6 не работает, Java 7 работает

Я попытался использовать JAXB 2.2.7 с Java 6u45 (скопировал jaxb-api.jar в каталог lib/endorsed), а другой jaxb- [core | impl | jxc | xjc] в мое приложение lib и добавили их в classpath), но я получил тот же результат.

Спасибо за ваши ответы.

ранжированы XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myStore> 
    <myModels> 
     <value>My Model 2</value> 
     <myEnum>VALUE2</myEnum> 
    </myModels> 
    <myModels> 
     <value>My Model 1</value> 
     <myEnum>VALUE1</myEnum> 
    </myModels> 
    <name>My Store</name> 
</myStore> 

MyModel:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class MyModel { 
public enum MyEnum { 
    VALUE1, VALUE2 
} 

private String value; 
private MyEnum myEnum; 

public MyModel() { 

} 

public MyModel(String value, MyEnum myEnum) { 
    this.setValue(value); 
    this.setMyEnum(myEnum); 
} 

public String toString() { 
    return getValue() + ", " + getMyEnum(); 
} 

public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

public MyEnum getMyEnum() { 
    return myEnum; 
} 

public void setMyEnum(MyEnum myEnum) { 
    this.myEnum = myEnum; 
} 

}

MyStore:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) 
public class MyStore { 
    private String name; 
    private Map<String, MyModel> myModels = new HashMap<String, MyModel>(); 

    public MyStore() { 

    } 

    public MyStore(String name) { 
     this.setName(name); 
    } 

    public void addMyModel(MyModel myModel) { 
     myModels.put(myModel.getValue(), myModel); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<MyModel> getMyModels() { 
     return new ArrayList<MyModel>(myModels.values()); 
    } 

    public void setMyModels(List<MyModel> myModels) { 
     for (MyModel myModel: myModels) { 
      this.myModels.put(myModel.getValue(), myModel); 
     } 
    } 
} 

класс Тест для сортировочных/демаршаллизации

import java.io.File; 

import javax.xml.bind.JAXB; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

import MyModel.MyEnum; 

public class MyStoreTest { 
    public static void main(String[] args) throws JAXBException { 
     MyStore myStore = new MyStore("My Store"); 
     myStore.addMyModel(new MyModel("My Model 1", MyEnum.VALUE1)); 
     myStore.addMyModel(new MyModel("My Model 2", MyEnum.VALUE2)); 

     File fileMyStore = new File("MyStore.xml"); 

     JAXB.marshal(myStore, fileMyStore); 

     JAXBContext context = JAXBContext.newInstance(MyStore.class, 
       MyModel.class); 
     Unmarshaller m = context.createUnmarshaller(); 
     MyStore myStoreFromXml = (MyStore) m.unmarshal(fileMyStore); 
     System.out.println(myStoreFromXml.getName()); 
     for (MyModel myModel : myStoreFromXml.getMyModels()) { 
      System.out.println(myModel.toString()); 
     } 
    } 
} 
+0

_ unmarshalling не работает_ дает нам практически никакой информации. Что происходит? – Keppil

+0

@ Keppil: Unmarshalling записей в списке не работает. Хэш-карта всегда пуста. – Siegi82AT

ответ

2

Когда демаршаллизации в List свойство JAXB будет проверять метод get, чтобы увидеть, если List уже инициализирована. Если он есть, он будет использоваться для добавления значений в. Это позволяет вам выбрать, что такое базовая версия List.

Ваш метод get всегда возвращает экземпляр ArrayList. Поскольку на него не ссылаются ни на что, данные, помеченные им, теряются.

Если ваш Map пуст, вы можете вернуть недвижимостью null вместо пустого ArrayList, чтобы получить возможность использовать ваш кейс.

+0

Спасибо за подробное объяснение. Если я возвращаю null, проблема в том, что в setMyModels myModels всегда пуст (размер 0). Должен ли я использовать специальный адаптер для решения этой проблемы? – Siegi82AT

Смежные вопросы