我目前正在开发一个从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调用,但外部结构总是相同的。我不希望将每个请求的整个代码交给彼此,但是希望将公共元素处理成一个共同的超类。我很欣赏任何关于如何做到这一点的暗示。
答案 0 :(得分:0)
好吧,我想出了一种方法可以自己做到这一点。您不必在抽象超类上设置@XMLRootElement
- 注释,而是在每个具体子类上(在此示例中,不在XXXAPICall
上,而是在FooBeanCall
上)。< / p>