我需要使用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创建了一个带XML metadata注释的Java类。对于变量XML部分,我使用了公共父类(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部件嵌入固定的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。为了将内容嵌入到父类编组中,是否要给出特定的类型?发布于 2013-05-14 14:34:12
XmlAdapter允许您将域对象转换为JAXB可以更好地处理的另一个值对象,用于编组/解编组。
如果来自其他模式的所有模型对象实际上都是BaseUserType的子类,那么您所需要做的就是让JAXBContext知道它们。在创建JAXBContext时,可以使用带有所有包名的冒号分隔字符串来实现这一点。
JAXBContext jc = JAXBContext.newInstance("com.example.common:com.example.foo:com.example.bar");https://stackoverflow.com/questions/16544098
复制相似问题