我是一名网络服务开发人员。在我的雇主,他们有一个非常丰富的数据模型,我可能不会改变太多。
几乎所有对象都能够通过toXML()方法将自身呈现为XML。将它们视为哈希映射,我们在运行之前不知道完整的字段集。
我正在尝试尽可能利用JAXB,因此我的一些Web服务对象是按照您的预期注释的常规POJO。但是,我想在JAXB注释的POJO中添加一个旧对象,并调用它的toXML()。
例如:
@XmlRootElement
class Metadata {
@XmlAttribute String serviceVersion;
@XmlAttribute String applicationVersion;
@XmlElement User user; // this is our object with it's own toXML method
}
理想情况下,我希望将整理后的结果视为:
<metadata serviceVersion="5.1" applicationVersion="12.1">
<user id="bmauter" firstname="Brian"/>
</metadata>
我研究过扩展XmlAdapter,但输出类似于:
<metadata serviceVersion="5.1" applicationVersion="12.1">
<user><user id="bmauter" firstname="Brian"/></user>
</metadata>
然后我想我在某处读取XmlAdapter将我的对象转换为org.w3c.dom.Element。我决定尝试一下,但它会爆炸,因为“JAXB无法处理接口”。
如何在常规的带JAXB注释的POJO中嵌入这样的对象?
谢谢!
更新:这是我正在尝试修复的实际示例。 (再次更新以显示在运行时之前不知道字段名称集。)
import java.util.HashMap;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Metadata {
@XmlAttribute String serviceVersion = "5.1";
@XmlAttribute String applicationVersion = "12.1";
@XmlElement @XmlJavaTypeAdapter(UserXmlAdapter.class) User user = new User();
static class User extends Row {
public User() {
tablename = "users";
fields.put( "id", "bmauter" );
fields.put( "firstname", "Brian" );
}
}
static class Row {
String tablename = null;
HashMap<String, Object> fields = new HashMap<String, Object>();
public String toXML() {
StringBuilder result = new StringBuilder();
result.append( "<" ).append( tablename );
for( String fieldName : fields.keySet() ) {
result.append( " " ).append( fieldName ).append( "=\"" ).append( fields.get( fieldName ) ).append( "\"" );
}
result.append( "/>" );
return result.toString();
}
}
static class UserXmlAdapter extends XmlAdapter<String, User> {
@Override public User unmarshal( String v ) throws Exception { return null; }
@Override public String marshal( User user ) throws Exception { return user.toXML(); }
}
public static void main( final String[] args ) throws Exception {
JAXBContext context = JAXBContext.newInstance( Metadata.class );
context.createMarshaller().marshal( new Metadata(), System.out );
}
}
答案 0 :(得分:1)
如果您有以下
@XmlRootElement
class Metadata {
@XmlAttribute String serviceVersion;
@XmlAttribute String applicationVersion;
@XmlElement User user; // this is our object with it's own toXML method
}
User
对象将根据其映射在Metadata
对象的XML中呈现。你不需要做任何特别的事情。