我目前正在开发一个从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] 删除。
我来说两句