2012-04-03 9 views
1

私は別のプロジェクトのマーシャリングをテストするプロジェクトをセットアップしました。 マーシャリングが機能しています。私は正しいxmlファイルを取得しますが、アンマーシャリングは機能していません。私はリレーション名(文字列)のみを取得します。属性と関数の依存関係がありません。JAXBアンマーシャリングが動作しない

EDIT:

メイン::01​​

がクラスを見てみてください:ここでは、ソースである

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: 出力1:

<?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つのアクセサ型を決定します。 –

+1

次の記事は、@ GrzegorzGrzybekの提案に役立ちます。http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html –

+0

ありがとう@GrzegorzGrzybekと@BlaiseDoughan!私はそれを見てください –

答えて

1

説明あなたはコンストラクタは"Testname"nameプロパティを移入Relationの新しいインスタンスをインスタンス化Mainクラスで

を持っていません。 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(); 
    } 

潜在的な解決策

変更、それはアンマーシャルRelationのインスタンスを返すためにimportFromXmlクラスのReadDbNow方法。

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

ありがとう!私は間違いがArraylistsによると思った。私は間違った終わりに間違いを探して多くの時間を費やしました! –

0

あなたは@XmlRootElementであなたのクラスに注釈を付ける必要があります。例えば。 Attributeは、現在の動作のための注釈

+0

残念です。最初の投稿を更新しました。 2つのxmlファイルを追加しました –

+0

proeprtyクラスごとにセッターメソッドがありますか? – fmucar

関連する問題