我已经了解了marshal和unmarshal复杂对象,我想知道是否可以使用JAXB来创建JFreeChart API的对象。
我已经尝试过自己,但不能使用下一个代码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType( propOrder = { "id", "type", "renderer"})
public class Renderer {
@XmlElement
private Integer id;
@XmlElement
private Integer type;
@XmlElement
private XYItemRenderer renderer = new StandardXYItemRenderer();
// Getter's / Setter's
XYItemRenderer getRenderer() {
return this.renderer;
}
public Integer getId() {
return this.id;
}
public void setId(Integer dataset_id) {
this.id = dataset_id;
}
public Integer getType() {
return this.type;
}
public void setType(Integer dataset_type) {
this.type = dataset_type;
}
}
它编译,但是当尝试解组文件时,抛出下一个异常:
WARNING [com.aws.chart]
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 14 counts of IllegalAnnotationExceptions
org.jfree.chart.renderer.xy.XYItemRenderer is an interface and jaxb can't handle interfaces.
this problem is related to the following location:
at org.jfree.chart.renderer.xy.XYItemRenderer
at private org.jfree.chart.renderer.xy.XYItemRenderer com.aws.chart.objectmodel.Renderer.renderer
at com.aws.chart.objectmodel.Renderer
at private com.aws.chart.objectmodel.Renderer com.aws.chart.objectmodel.Dataset.renderer
at com.aws.chart.objectmodel.Dataset
at private java.util.ArrayList com.aws.chart.objectmodel.Plot.datasets
at com.aws.chart.objectmodel.Plot
at private java.util.ArrayList com.aws.chart.objectmodel.Chart.plots
at com.aws.chart.objectmodel.Chart
.................
我做错了什么或者根本不可能做到这一点?
提前致谢。
答案 0 :(得分:0)
所以它可以做到,但这并不简单。
首先,引用的JFReeChart类必须可由jaxb序列化。由于您无法为它们添加anotations,因此它们必须是marshallable / unmarshallabe,仅使用默认的jaxb设置。使用复杂的类层次结构/对象结构可能无法实现。
接口问题或无法正常工作的默认映射可能由处理转换的usied XMLAdaptor解决。
http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html
您必须通过尝试并修复错误方法来处理它,以查看哪些元素导致jaxb出现问题。解决这些问题可能需要做太多工作。
其他方法将使用Java正常序列化,您可以序列化JFreeChart对象,然后在xml字段中将序列化流编码为BASE64。那么你的课程在取消之后,可以反序列化该字段以重新创建JFreeChart对象。
所以最爱的人就是你的班级
@XMLElement
String serialRender;
@XmlTransient
XYItemRenderer renderer;
boolean beforeMarshal(Marshaller mar) {
serialRender = serializeToString(renderer);
}
void afterUnmarshal(Unmarshaller unm, Object parent) {
renderer = deserializeFromString(serialRender);
}