java - JAXB XMLAdapter 编码问题

标签 java marshalling jaxb2 xmladapter

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

约束是什么?

变量的内容XML零件应该是 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上面的注释 Java 类 XML metadata .对于可变 XML 部分,我使用了公共(public)父类 ( BaseUserType ),它由所有 5 个不同的类 <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正在生成(如下图)。但是输出不是预期的。它没有正确嵌入可变 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 .为了将内容嵌入父类编码,是否需要提供任何特定类型?

最佳答案

XmlAdapter 的工作原理是允许您将域对象转换为 JAXB 可以更好地处理以进行编码/解码的另一个值对象。

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

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

关于java - JAXB XMLAdapter 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16544098/

相关文章:

VB.NET 尝试将泛型 Invoke 方法修改为泛型 BeginInvoke 方法,出现意外问题

java - 为什么我需要编译才能使 Groovy 代码工作?

JavaFX FileChooser Filefilter 不返回扩展名

go - MarshalBinary time.Time : predicting its byte-size

c# - 在 C# 中将 CodeElements 编码到 IntPtr

java - JAXB 2.x : How to unmarshal an XML without knowing the target class?

web-services - 空 SOAP 响应 - 使用 JBoss 4.2、Jaxb2、Java 1.6

java - 在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件一起使用?

java - 任何可用于 LiquiBase 的 API

java - 我们可以向后拆分 Java 字符串吗?