Das Mapping von Klassen auf XML kann in Castor u.a. mit
“In mapping mode, the user provides Castor XML with a user-defined mapping (in form of a mapping file) that allows the (partial) definition of a customized mapping between Java classes (and their properties) and XML.”
(Castor Doku, http://castor.codehaus.org/xml-framework.html#Mapping-mode)
“In introspection mode, Castor XML uses Java reflection to establish the binding between the Java classes (and their properties) and the XML, …”
(Castor Doku, http://castor.codehaus.org/xml-framework.html#Introspection-mode)
Hat man eine Klassenhierarchie so kann immer nur ein Mode benutzt werden, z.B.:
Beim Marshalling passiert nun folgendes:
Hat man viele Klassen für das Marshalling und diese Klassen haben eine oder mehrere gemeinsame Basisklassen, so müsste man entweder
Immer Introspection zu verwenden ist oft nicht die passende Lösung - es werden zum Teil Elemente gemarshalled, die nicht gewünscht sind.
Die Klassen org.exolab.castor.xml.XMLClassDescriptorResolver
und org.exolab.castor.xml.Introspector
sind in
Castor für das Auflösen der XML-Definition verantwortlich. Ist das Mapping einer Klasse durch
eine Mapping Datei definiert, so liefert XMLClassDescriptorResolver
das Ergebnis,
andernfalls wird zu Introspector
delegiert. Die generateClassDescriptor
-Methode wird im Introspector
dann auch
rekursiv für die Superklassen aufgerufen.
Mir einem eigenen Introspector, der die generateClassDescriptor Methoden übeschreibt, kann man die Aufrufe ggf. an XMLClassDescriptorResolver umleiten:
public class CustomIntrospector extends Introspector
{
private final XMLClassDescriptorResolver resolver;
public CustomIntrospector(XMLClassDescriptorResolver resolver)
{
super();
this.resolver = resolver;
}
public CustomIntrospector(XMLClassDescriptorResolver resolver, ClassLoader classLoader)
{
super(classLoader);
this.resolver = resolver;
}
@Override
public XMLClassDescriptor generateClassDescriptor(Class c) throws MarshalException
{
return super.generateClassDescriptor(c,null);
}
@Override
public XMLClassDescriptor generateClassDescriptor(Class c, PrintWriter errorWriter) throws MarshalException
{
try
{
return (XMLClassDescriptor) resolver.resolve(c);
}
catch (ResolverException e)
{
throw new MarshalException(e);
}
}
}
Da die Castor-Klassen Introspector und XMLClassDescriptorResolverImpl nicht so leicht anpassbar sind, muss man diese kopieren und an (sehr) wenigen Stellen anpassen.