gpt4 book ai didi

java - JAXB XMLAdapter 编码问题

转载 作者:行者123 更新时间:2023-11-30 11:32:39 26 4
gpt4 key购买 nike

我需要生成一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com