Java 如何使用在多个文件(.xml)中具有共享引用的JAXB解组文件
JAXB用于将java对象打包到文件中Java 如何使用在多个文件(.xml)中具有共享引用的JAXB解组文件,java,xml,jaxb,Java,Xml,Jaxb,JAXB用于将java对象打包到文件中 @XmlRootElement public class CompleteCollectionInfo { @XmlElement(required = true) @XmlID @XmlSchemaType(name = "ID") protected String uid; } @XmlRootElement public class AssociationInfo { @XmlElement(requir
@XmlRootElement
public class CompleteCollectionInfo {
@XmlElement(required = true)
@XmlID
@XmlSchemaType(name = "ID")
protected String uid;
}
@XmlRootElement
public class AssociationInfo {
@XmlElement(required = true)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
@XmlJavaTypeAdapter(type= CompleteCollectionInfo.class , value =AssociationCompleteCollectionInfoAdapter.class)
protected CompleteCollectionInfo associatedcollection;
}
适配器将确保在关联信息中正确设置了所有完整的CollectionInfo引用(如果之前已解组)
public class AssociationCompleteCollectionInfoAdapter extends XmlAdapter<String, CompleteCollectionInfo>{
@Override
public CompleteCollectionInfo unmarshal(String v) throws Exception {
CompleteCollectionInfo completeCollectionInfo = UnBlobUtil.completeCollectionCache.get(v);
if (completeCollectionInfo == null )
completeCollectionInfo = new CompleteCollectionInfo();
completeCollectionInfo.setUid(v);
return completeCollectionInfo;
}
@Override
public String marshal(CompleteCollectionInfo v) throws Exception {
return v.getUid();
}
}
公共类关联CompleteCollectionFoAdapter扩展了XmlAdapter{
@凌驾
公共CompleteCollectionInfo解组(字符串v)引发异常{
CompleteCollectionInfo CompleteCollectionInfo=UnBlobUtil.completeCollectionCache.get(v);
if(completeCollectionInfo==null)
completeCollectionInfo=新的completeCollectionInfo();
完成收集信息setUid(v);
返回completeCollectionInfo;
}
@凌驾
公共字符串封送处理(CompleteCollectionInfo v)引发异常{
返回v.getUid();
}
}
编组时我收到的异常:
com.sun.xml.internal.bind.v2.runtime.illegalannotations异常:1个IllegalAnnotationExceptions计数
XmlIDREF属性正在引用一个没有XmlID属性的类型“java.lang.String”。为了让
JAXBContext
知道如何解组Student
,您必须执行以下操作:
JAXBContext theContext = JAXBContext.newInstance (Group.class, Student.class);
为了让
JAXBContext
也知道如何解组Student
,您必须执行以下操作:
JAXBContext theContext = JAXBContext.newInstance (Group.class, Student.class);
您的
XmlAdapter
正在告诉JAXB
将CompleteCollectionInfo
作为字符串处理。因此,String
确实没有用@XmlID
注释的属性@XmlID
/@XmlIDREF
用于文档中的引用,因此它无论如何都不适用于您的用例
您已经在使用XmlAdapter
为您的用例做正确的事情。要使事情正常运行,您只需删除@XmlID
/@XmlIDREF
您的XmlAdapter
告诉JAXB
将CompleteCollectionInfo
视为字符串。因此,String
确实没有用@XmlID
注释的属性@XmlID
/@XmlIDREF
用于文档中的引用,因此它无论如何都不适用于您的用例
您已经在使用XmlAdapter
为您的用例做正确的事情。要使事情正常进行,您只需删除@XmlID
/@XmlIDREF
您可以发布Group.xml吗?您可以发布Group.xml吗?但是学生详细信息存储在单独的文件中,交叉引用,即使我做了你提到的更改,它也不起作用。你能发布两个xml文件吗?但是学生的详细信息存储在一个单独的文件中,交叉引用。即使我做了你提到的更改,它也不起作用。你能发布两个xml文件吗?谢谢@blaise,我明白你想说的是什么,我会在实现后返回你@blaise,我明白你想说的是什么,我会在实施后回复你