2

我需要XML使用以下格式生成文件JAXB2,它具有固定可变xml 内容。

什么是约束?

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

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为上面创建了一个带注释的 Java 类XML metadata。对于可变 XML 部分,我使用BaseUserType了由所有 5 个不同 Classes 扩展的公共 Parent 类 ( ) <user_type>。并尝试使用覆盖marshall(..)操作@XmlJavaTypeAdapter。(如下)

JAXB 注释类:

@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正在生成(如下所示)。但输出不是预期的。它没有正确嵌入带有 Fixed 的 Variable 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. 为了将内容嵌入到父类编组中,是否需要给出任何特定的类型?
4

1 回答 1

1

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

如果其他模式中的所有模型对象都是 的子类BaseUserType,那么您需要做的就是JAXBContext了解它们。您可以在创建时执行此操作,方法JAXBContext是使用带有所有包名称的冒号分隔字符串。

JAXBContext jc = JAXBContext.newInstance("com.example.common:com.example.foo:com.example.bar");
于 2013-05-14T14:34:12.683 回答