MOxy の @XmlInverseReference アノテーションを利用して、3 つのエンティティの配置をマーシャリングしようとしています。私のシナリオは、ここで提供されている例を非常によく反映してい ます
エンティティ A はエンティティ B のコレクションを保持し、エンティティ B はエンティティ C のコレクションを保持します。違いは、エンティティ B の C のコレクションがカスタム コンパレータを使用して並べ替えられることです。ツリーをマーシャリングしようとすると、エンティティ B のコレクションにエンティティ A が含まれているかどうかがチェックされ、エンティティ C のみを受け入れるカスタム コンパレータで例外が発生する ClassCastException が発生します。
A の B のコレクションの宣言は次のとおりです。
@XmlElement
private Set<AssignmentPeriod> periods = new LinkedHashSet<AssignmentPeriod>();
これは、カスタム コンパレータを使用して並べ替えられた C in B のコレクションです。
@XmlElement
@XmlInverseReference(mappedBy="assignmentPeriod")
@Sort(type = SortType.COMPARATOR,comparator=AssignmentPeriodRateComparator.class)
private Set<AssignmentPeriodRate> rates = new LinkedHashSet<AssignmentPeriodRate>();'
最後に、C のエンティティ B への逆参照
@XmlElement
@XmlInverseReference(mappedBy="rates")
private AssignmentPeriod assignmentPeriod;
コンパレーターへの参照を削除すると、完全に正常にマーシャリングされます。コンパレーター注釈を再度追加すると、AssignmentPeriodRate のリストがチェックされ、CandidateAssignment 型のオブジェクトが含まれているかどうかがチェックされるクラス キャスト例外が発生します。
スタックトレースは以下です。任意のポインタは、感謝して受信されます!
Caused by: java.lang.ClassCastException: uk.co.rullion.mypayroll.entities.assignment.CandidateAssignment cannot be cast to uk.co.rullion.mypayroll.entities.assignment.AssignmentPeriodRate
at uk.co.rullion.mypayroll.entities.assignment.AssignmentPeriodRateComparator.compare(AssignmentPeriodRateComparator.java:1) [myPayrollEntities-0.0.1-SNAPSHOT.jar:]
at java.util.TreeMap.getEntryUsingComparator(Unknown Source) [rt.jar:1.7.0_17]
at java.util.TreeMap.getEntry(Unknown Source) [rt.jar:1.7.0_17]
at java.util.TreeMap.containsKey(Unknown Source) [rt.jar:1.7.0_17]
at java.util.TreeSet.contains(Unknown Source) [rt.jar:1.7.0_17]
at org.hibernate.collection.internal.PersistentSet.contains(PersistentSet.java:171) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
at org.eclipse.persistence.internal.queries.CollectionContainerPolicy.contains(CollectionContainerPolicy.java:113) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.queries.ContainerPolicy.contains(ContainerPolicy.java:701) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.queries.ContainerPolicy.contains(ContainerPolicy.java:1) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshal(XMLCompositeCollectionMappingNodeValue.java:97) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:149) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:401) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:240) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshalSingleValue(XMLCompositeCollectionMappingNodeValue.java:324) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshal(XMLCompositeCollectionMappingNodeValue.java:104) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:149) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:401) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:240) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:751) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshalStreamOrWriter(XMLMarshaller.java:1128) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:1079) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:1034) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:684) [eclipselink-2.5.1-RC1.jar:2.5.1.v20130824-981335c]
... 35 more