2012-04-03 7 views
1

Я создал проект для тестирования сортировки для другого проекта. Маршаллинг работает. Я получаю правильный xml-файл, но unmarshalling НЕ работает. Я получаю только имя отношения (String). Отсутствуют атрибуты и функциональные зависимости.JAXB unmarshalling not working

EDIT: Вот источник: Sourcecode

Пожалуйста, обратите внимание на классы:

Главная:

public class Main { 

public static void main(String[] args){ 

    Relation db = new Relation(); 

    Attribute a1 = new Attribute("Attribute 1", true, false); 
    Attribute a2 = new Attribute("Attribute 2", false, false); 
    Attribute a3 = new Attribute("Attribute 3", false, true); 

    db.addAttribute(a1); 
    db.addAttribute(a2); 
    db.addAttribute(a3); 

    ArrayList<String> src = new ArrayList<String>(); 
    src.add("Attribute 1"); 

    ArrayList<String> dest = new ArrayList<>(); 
    dest.add("Attribute 2,Attribute 3"); 

    FDs f1 = new FDs(src, dest); 

    db.addFd(f1); 

    exportToXml saver = new exportToXml(); 
    try { 
     saver.SaveDbNow(db); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //Export again to test output 
    Relation db2 = new Relation(); 

    importFromXml reader = new importFromXml(); 
    try { 
     reader.ReadDbNow(db2); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     saver.SaveDbNow2(db2); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

} 

отношений:

@XmlRootElement(name = "Relation") 
public class Relation { 
@XmlElement(name = "RelName") 
String name; 

@XmlElement(name = "Attribute") 
private ArrayList<Attribute> attrList; 
@XmlElement(name = "FD") 
private ArrayList<FDs> fdsList; 

public Relation() { 
    this.attrList = new ArrayList<>(); 
    this.fdsList = new ArrayList<>(); 
    this.name = "Testname"; 
} 

public Relation(String name, ArrayList<Attribute> attrList, ArrayList<FDs> fdsList) { 
    super(); 
    this.attrList = attrList; 
    this.fdsList = fdsList; 
} 

@XmlTransient 
public ArrayList<Attribute> getAttrList() { 
    return attrList; 
} 

public void setAttrList(ArrayList<Attribute> attrList) { 
    this.attrList = attrList; 
} 

@XmlTransient 
public ArrayList<FDs> getFdsList() { 
    return fdsList; 
} 

public void setFdsList(ArrayList<FDs> fdsList) { 
    this.fdsList = fdsList; 
} 

public void addAttribute(Attribute a) { 
    this.attrList.add(a); 
} 

public void addFd(FDs fd) { 
    this.fdsList.add(fd); 
} 

} 

Атрибут:

public class Attribute { 
@XmlElement(name = "Attributename") 
private String name; 
@XmlElement(name = "isPK") 
private boolean isPK; 
@XmlElement(name = "isFK") 
private boolean isFK; 

public Attribute(){ 

} 


public Attribute(String name, boolean isPK, boolean isFK) { 
    super(); 
    this.name = name; 
    this.isPK = isPK; 
    this.isFK = isFK; 
} 

@XmlTransient 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
@XmlTransient 
public boolean isPK() { 
    return isPK; 
} 

public void setPK(boolean isPK) { 
    this.isPK = isPK; 
} 

@XmlTransient 
public boolean isFK() { 
    return isFK; 
} 
public void setFK(boolean isFK) { 
    this.isFK = isFK; 
} 
} 

FD:

public class FDs { 
@XmlElement(name = "Source") 
private ArrayList<String> src; 
@XmlElement(name = "Destination") 
private ArrayList<String> dest; 

public FDs(){ 

} 

public FDs(ArrayList<String> src, ArrayList<String> dest) { 
    super(); 
    this.src = src; 
    this.dest = dest; 
} 

@XmlTransient 
public ArrayList<String> getSrc() { 
    return src; 
} 
public void setSrc(ArrayList<String> src) { 
    this.src = src; 
} 

@XmlTransient 
public ArrayList<String> getDest() { 
    return dest; 
} 
public void setDest(ArrayList<String> dest) { 
    this.dest = dest; 
} 
} 

Экспорт:

public class exportToXml { 

public void SaveDbNow(Object saveMe) throws Exception { 
    JAXB.marshal(saveMe, new File("test.xml")); 
} 

public void SaveDbNow2(Object saveMe) throws Exception { 
    JAXB.marshal(saveMe, new File("test2.xml")); 
} 
} 

Импорт:

public class importFromXml { 

public void ReadDbNow(Object readMe) throws Exception { 
    readMe = JAXB.unmarshal(new FileInputStream("test.xml"), Relation.class); 
} 
} 

Заранее спасибо!

EDIT: Output1:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Relation> 
<RelName>Testname</RelName> 
<Attribute> 
    <Attributename>Attribute 1</Attributename> 
    <isPK>true</isPK> 
    <isFK>false</isFK> 
</Attribute> 
<Attribute> 
    <Attributename>Attribute 2</Attributename> 
    <isPK>false</isPK> 
    <isFK>false</isFK> 
</Attribute> 
<Attribute> 
    <Attributename>Attribute 3</Attributename> 
    <isPK>false</isPK> 
    <isFK>true</isFK> 
</Attribute> 
<FD> 
    <Source>Attribute 1</Source> 
    <Destination>Attribute 2,Attribute 3</Destination> 
</FD> 

Выход2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Relation> 
<RelName>Testname</RelName> 
</Relation> 
+1

Вы смешивание добытчиков и поле. Определите один тип доступа, используя, например, '@XmlAccessorType (XmlAccessType.FIELD)' аннотацию для классов. –

+1

Следующая статья поможет с предложением @GrzegorzGrzybek: http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html –

+0

Спасибо @GrzegorzGrzybek и @BlaiseDoughan! Я посмотрю на это –

ответ

1

Объяснения для текущего поведения

В Main классе инстанцирование нового экземпляра Relation конструктор заполнит name свойства "Testname". В экземпляре Relation ничего больше не заселено, поэтому вы видите вывод XML.

// Export again to test output 
    Relation db2 = new Relation(); 

    importFromXml reader = new importFromXml(); 
    try { 
     reader.ReadDbNow(db2); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     saver.SaveDbNow2(db2); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Потенциальное решение

Изменение ReadDbNow метод на importFromXml класс, чтобы вернуть экземпляр Relation что unmarshalled.

import java.io.FileInputStream; 
import javax.xml.bind.JAXB; 

public class importFromXml { 

    public Relation ReadDbNow() throws Exception { 
     return JAXB 
       .unmarshal(new FileInputStream("test.xml"), Relation.class); 
    } 
} 

В Main классе изменить код, чтобы сделать следующее:

// Export again to test output 
    Relation db2 = null; 

    importFromXml reader = new importFromXml(); 
    try { 
     db2 = reader.ReadDbNow(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     saver.SaveDbNow2(db2); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

Спасибо большое! Я думал, что ошибка была у аррайалистов. Я потратил много времени на поиск ошибки на другом конце! –

0

Вы должны аннотировать классы с @XmlRootElement. Например. Attribute не имеет аннотации

+0

Извините, но не работает. Обновлен 1-й пост. Добавлено 2 файла xml –

+0

У вас есть методы настройки для каждого класса proeprty? – fmucar