繁体   English   中英

在带有JAXB注释的对象内将对象与toXML方法一起使用?

[英]Use object with toXML method inside a JAXB-annotated object?

我是Web服务开发人员。 在我的雇主那里,他们拥有非常丰富的数据模型,我可能不会改变太多。

几乎所有对象都可以通过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>&lt;user id=&quot;bmauter&quot; firstname=&quot;Brian&quot;/&gt;</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 );
    }
}

当您具有以下条件时

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM