Details
Description
Here is a short exmple (see attachment for full code):
==========================
public interface Bug_Itf
{ }
public abstract class Bug_Abstract implements Bug_Itf
{ }
public class Bug_Impl extends Bug_Abstract
// implements Bug_Itf // ==> if not explicitly mentioned, JiBX is not aware of this relationship
{ }
public class Bug_Test {
private Bug_Itf m_impl; // ==> Note: If m_impl is of type Bug_Impl or Bug_Abstract, the pb doesn't appear
public static void main (String[] args) throws Exception
{ Bug_Test t = new Bug_Test(); IBindingFactory bfact = BindingDirectory.getFactory(Bug_Test.class); IMarshallingContext mctx = bfact.createMarshallingContext(); mctx.marshalDocument(t, "UTF-8", null, System.out); }}
==========================
when applying the binding (see it below),
javac -classpath '.;jibx-run.jar' *.java
java -jar jibx-bind.jar Bug_binding.xml
I get the error
Error: No compatible mapping defined for type Bug_Itf; on structure element at (line 20, col 50, in Bug_binding.xml)
Error running binding compiler
org.jibx.runtime.JiBXException: Binding Bug_binding.xml is unusable because of validation errors
at org.jibx.binding.Utility.loadBinding(Utility.java:346)
at org.jibx.binding.Utility.loadFileBinding(Utility.java:413)
at org.jibx.binding.Compile.compile(Compile.java:296)
at org.jibx.binding.Compile.main(Compile.java:385)
Mentioning explicitly the Bug_Impl implements Bug_Itf resolves the pb.
Bug_binding.xml:
=============================
<?xml version='1.0' encoding='UTF-8' ?>
<binding>
<!-- abstract mapping for
Bug_Abstract (implements interface Bug_Itf) -->
<mapping class="Bug_Abstract" abstract="true" type-name="A_abstract" />
<!-- abstract and concrete mappings for
Bug_Impl (extends abstract class Bug_Itf) -->
<mapping class="Bug_Impl" abstract="true" type-name="A_impl">
<structure map-as="A_abstract" />
</mapping>
<mapping name="impl" class="Bug_Impl">
<structure map-as="A_impl" />
</mapping>
<!-- the test class, contains a "private Bug_Itf m_impl" -->
<mapping class="Bug_Test" abstract="true" type-name="A_test">
<structure field="m_impl" usage="optional" />
</mapping>
<mapping name="test" class="Bug_Test">
<structure map-as="A_test" />
</mapping>
</binding>
=============================
Can anyone give me a clue as to how to deal with multiple classes which implement the same interface?
Right now I'm trying (without success):
<mapping class="CommonImpl" abstract="true" />
<mapping name="commentrecord" class="CommentRecord" extends="CommonImpl">
<value name="comment" field="comment" usage="optional"/>
</mapping>
<mapping name="simpleresourcerecord" class="SimpleRecord" extends="CommonImpl">
<value name="namepattern" field="namePattern" />
<value name="ttl" field="ttl" usage="optional"/>
</mapping>