Java 如何使用在多个文件(.xml)中具有共享引用的JAXB解组文件

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

JAXB用于将java对象打包到文件中

@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,我明白你想说的是什么,我会在实施后回复你