我需要生成一个 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>
我的问题是:
- 为什么
JAXB marshallers
无法嵌入“CustomXMLAdapter
”与父级(UserInfo.class)
编码的内容. - 在
JAXB
中我们有任何替代选择吗?做这个简单吗? - 如何指定
BoundType
,ValueType
在XMLAdapter
.为了将内容嵌入父类编码,是否需要提供任何特定类型?
最佳答案
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/