类似XML文件的通用超类

时间:2014-07-31 13:29:34

标签: java jaxb jax-ws

我目前正在开发一个从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调用,但外部结构总是相同的。我不希望将每个请求的整个代码交给彼此,但是希望将公共元素处理成一个共同的超类。我很欣赏任何关于如何做到这一点的暗示。

1 个答案:

答案 0 :(得分:0)

好吧,我想出了一种方法可以自己做到这一点。您不必在抽象超类上设置@XMLRootElement - 注释,而是在每个具体子类上(在此示例中,不在XXXAPICall上,而是在FooBeanCall上)。< / p>