JAXB XMLAdapter编组问题

时间:2013-05-14 13:09:17

标签: java marshalling jaxb2 xmladapter

我需要使用XML以低于格式生成JAXB2文件,它同时包含 已修复 变量 xml内容。

什么是约束?

变量XML Part的内容应该是5个不同的XML schema之一(计划让JAXB2.0实现5个不同的java类来生成它),这需要嵌入到固定的XML内容。

XML格式:

<user_info>
  <header>     //Fixed XML Part
     <msg_id>..</msg_id>
     <type>...</type>
  </header>
  <user_type>    //  Variable XML content
                      // (userType : admin, reviewer, auditer, enduser, reporter)
    ........  
  </user_type>
</user_info>

我尝试了什么?

我为上面的JAXB创建了一个XML metadata带注释的Java类。对于变量XML部分,我使用了通用的父类(BaseUserType),它由所有5个不同的类<user_type>扩展。并尝试使用marshall(..)覆盖@XmlJavaTypeAdapter操作。 (如下)

JAXB Annotated Class:

@XmlRootElement(name="user_info")
public class UserInfo {

    private Header header;  //reference to JAXB annotated Class Header.class

    @XmlJavaTypeAdapter(value=CustomXMLAdapter.class)
    private BaseUserType userType; // Base class - acts as a common Type
                                    //  for all 5 different UserType JAXB annotated Classes

    // Getters setters here..
    // Also tried to declare JAXB annotations at Getter method
}

自定义XML适配器类:

public class CustomXMLAdapter extends XmlAdapter<Writer, BaseInfo> { 
       private Marshaller marshaller=null; 

        @Override 
        public BaseInfo unmarshal(Writer v) throws Exception { 
            // Some Implementations here...
        }

        @Override 
        public Writer marshal(BaseInfo v) throws Exception { 
                OutputStream outStream = new ByteArrayOutputStream(); 
                Writer strResult = new OutputStreamWriter(outStream); 
                if(v instanceof CustomerProfileRequest){ 
                    getMarshaller().marshal((CustomerProfileRequest)v, strResult ); 
                } 
                return strResult; 
        }

        private Marshaller getMarshaller() throws JAXBException{ 
                if(marshaller==null){ 
                        JAXBContext jaxbContext = JAXBContext.newInstance(Admin.class, Reviewer.class, Enduser.class, Auditor.class, Reporter.class);
                        marshaller = jaxbContext.createMarshaller(); 
                } 
                return marshaller; 
        } 
}

我现在在哪里挣扎?

我没有遇到任何错误或警告,正在生成XML(如下所示)。但输出不是预期的输出。它没有正确地嵌入固定的部分

输出

 <user_info>
        <header> 
           <msg_id>100</msg_id>
           <type>Static</type>
        </header>
        <user_type/> // Empty Element, even though we binded the value properly.
    </user_info>

我的问题是:

  1. 为什么JAXB marshallers无法将“CustomXMLAdapter”编组内容与父(UserInfo.class)一起嵌入。
  2. 我们在JAXB中有任何替代选项来做到这一点吗?
  3. 如何在BoundType中指定ValueTypeXMLAdapter。是否有任何特定的类型要将内容嵌入父类编组?

1 个答案:

答案 0 :(得分:1)

XmlAdapter允许您从域对象转换为JAXB可以更好地处理以用于编组/解组的另一个值对象。

如果来自其他模式的所有模型对象都是BaseUserType的子类,那么您需要做的就是让JAXBContext知道它们。您可以通过将冒号分隔的String与所有包名称一起创建JAXBContext来执行此操作。

JAXBContext jc = JAXBContext.newInstance("com.example.common:com.example.foo:com.example.bar");