相似XML文件的通用超类

多义齿

我目前正在开发一个从API读取XML文件的应用程序。API不提供架构信息。

我根据以下文章创建了Java Bean:http : //duckranger.com/2011/06/jaxb-without-a-schema/

这行得通,但是我在创建适当的普通超类时遇到了问题。

API的XML文件有两种形式:一种是响应中只有一项时,另一种是响应中有一系列项时。为了便于讨论,仅关注响应中只有一项的情况就足够了。响应始终具有以下形式:

<?xml version='1.0' encoding='UTF-8'?>
<xxxapi version="2">
  <currentTime>2010-10-05 20:28:55</currentTime>
  <result>
    <property_a>...</property_a>
    <property_b>...</property_b>
  </result>
  <cachedUntil>2010-10-05 20:33:55</cachedUntil>
</eveapi>

重要的是,根据请求,只有porperty_a,property_b等会发生更改。其余的鼻涕保持不变。

现在,我创建了以下bean来解组数据(缩短了,在这里不包含setter):

import java.util.Date;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="xxxapi")
public class XXXAPICall {       

    private Date currentTime;
    private Date cachedUntil;

    @XmlJavaTypeAdapter(DateAdapter.class)
    @XmlElement(/*name="currentTime",*/ required = true)
    public Date getCurrentTime () {
        return currentTime;
    }       

    @XmlJavaTypeAdapter(DateAdapter.class)
    @XmlElement(/*name="cachedUntil",*/ required = true)
    public Date getCachedUntil () {
        return cachedUntil;
    }
}

现在,这可以正常工作并完成应做的事情。但是我很难创建一个不涉及大量复制和粘贴的通用解决方案。

我创建了另一个类FooBean:

XmlRootElement(name="result")
public class FooBean {

    private String property_a, property_b;

    @XmlElement(name="property_a", required = true)
    public String getProperty_a(){
        return property_a;
    }
}

等等。现在,我尝试以某种方式将其合并:

public class FooBeanCall extends XXXAPICall {

    public FooBean fooBean; 

    @XmlElement(name="result")
    public FooBean getFooBean () {
        return fooBean;
    }

    // setter omitted

}

但这不起作用:

MessageBodyReader not found for media type=application/xml; charset=utf-8, type=class FooBeanCall, genericType=class FooBeanCall

那么,我该怎么做呢?基本上,我有数十个具有不同结果的API调用,但外部结构始终相同。我不想将每个请求的整个代码都转换为另一个请求,但是我想让一个普通的超类处理常见的元素。我希望您能找到有关此操作的任何提示。

多义齿

好吧,我想出了一种自己解决这个问题的方法。您无需@XMLRootElement在抽象超类上设置-Annotation,而是在每个具体的子类上设置(在此示例中,不是onXXXAPICall而是on FooBeanCall)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章