我是一名网络服务开发人员。在我的雇主,他们有一个非常丰富的数据模型,我可能无法对其进行太多更改。

几乎所有对象都能够通过 toXML() 方法将自身呈现为 XML。将它们视为 HashMap ,直到运行时我们才知道完整的字段集。

我正在尝试尽可能利用 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>&lt;user id=&quot;bmauter&quot; firstname=&quot;Brian&quot;/&gt;</user> 
</metadata> 

然后我想我在某处读到了使 XmlAdapter 将我的对象转换为 org.w3c.dom.Element 的方法。我决定尝试一下,但它失败了,因为“JAXB 无法处理接口(interface)”。

如何将这样的对象嵌入常规 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 ); 
    } 
} 

请您参考如下方法:

当你有以下情况

@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 中呈现。您不需要做任何特别的事情。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!