JAXB和JFreeChart。这是可能的?

时间:2015-03-12 15:50:51

标签: java xml jaxb jfreechart

我已经了解了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
.................

我做错了什么或者根本不可能做到这一点?

提前致谢。

1 个答案:

答案 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);
}