JAXB解组无法正常工作
我已经设置了一个项目来测试另一个项目的编组。编组正在工作。我得到正确的xml文件,但解组不起作用。我只获得关系名称(字符串)。缺少属性和功能依赖关系。JAXB解组无法正常工作
编辑:这里是源: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);
}
}
提前感谢!
编辑: 输出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>
解释当前的行为
在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
实例。
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();
}
非常感谢!我认为这个错误是由Arraylists。我花了很多时间在错误的结尾寻找错误! – 2012-04-11 10:56:35
您需要@XmlRootElement
来注释类。例如。 Attribute
没有注释
对不起,没有工作。更新第1篇文章。添加了2个xml文件 – 2012-04-03 09:05:10
你对每个类的proeprty都有setter方法吗? – fmucar 2012-04-03 09:10:03
你混合getter和领域。使用例如'@XmlAccessorType(XmlAccessType.FIELD)'类的注解来决定一个访问器类型。 – 2012-04-03 09:15:44
下面的文章将有助于@GrzegorzGrzybek给出的建议:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html – 2012-04-03 10:17:03
感谢@GrzegorzGrzybek和@BlaiseDoughan!我会看看它 – 2012-04-03 12:43:04