Hi Zach,

I don't see offhand why the approach of using an abstract mapping for
IOrderItem gave the ClassFormatError, though it sounds like JiBX is
inappropriately adding code to the interface. Though now that I look at
the binding again, I wonder if it's because you're using a
name="order-item" on the abstract mapping. This was previously illegal
(name on an abstract mapping), but I started allowing it to handle some
cases that came up in the binding+schema generation from existing code -
and that may have opened up some untested (and broken) code paths. Try
taking off the name="order-item" and see if that works (and let us know
the result).

The second case is easier to explain. The generic handling only works
with classes which have concrete mapping definitions, which JiBX extends
with IMarshallable and IUnmarshallable interfaces. If you gave OrderItem
a concrete mapping this would work - but presumably you're instead
trying to bind the interface because you want to avoid mapping the
implementation class(es).

  - Dennis

Dennis M. Sosnoski
SOA and Web Services in Java
Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117



Zachary Paul wrote:
> I'm having an issue mapping a collection whose items are interfaces. 
> For example, I've got a Customer that has an interface IOrder as an
> attribute.  IOrder contains a List which will contain IOrderItem
> interfaces.  If I map the collection using a nested structure,
> everything works fine.
>
>     <mapping class="IOrder" name="order" abstract="true"
> factory="Order.getInstance" >
>         <value name="order-number" get-method="getOrderNumber"
> set-method="setOrderNumber" />
>         <collection name="order-items" create-type="java.util.ArrayList"
>                     get-method="getItems" set-method="setItems">
>
>             <!-- Define IOrderItem -->           
>             <structure name="order-item" type="IOrderItem"
>                        abstract="true" factory="OrderItem.getInstance">
>                 <value name="item-number" get-method="getItemNumber"
> set-method="setItemNumber" />
>             </structure>
>
>         </collection>
>
>
> While this works, it seems more appropriate to define IOrderItem in
> its own mapping so that I can reuse that definition instead of
> redefining the structure for every class that uses it.  I found a post
> in the mailing list archive that suggested something like this.
>
>     <mapping class="IOrder" name="order" abstract="true"
> factory="Order.getInstance" >
>         <value name="order-number" get-method="getOrderNumber"
> set-method="setOrderNumber" />
>         <collection name="order-items" create-type="java.util.ArrayList"
>                     get-method="getItems" set-method="setItems">
>             <structure name="order-item" type="IOrderItem" />
>         </collection>
>     </mapping>
>    
>     <!-- Define IOrderItem -->           
>     <mapping name="order-item" class="IOrderItem"
>                abstract="true" factory=" OrderItem.getInstance">
>         <value name="item-number" get-method="getItemNumber"
> set-method="setItemNumber" />
>     </mapping>
>
>
> When I do this, I get the following error.
>
> The java class could not be loaded. java.lang.ClassFormatError:
> (IOrderItem) interface method must be public and abstract at offset=265
>
> I've also tried defining the collection more generically...
>
>     <mapping class="IOrder" name="order" abstract="true"
> factory="Order.getInstance" >
>         <value name="order-number" get-method="getOrderNumber"
> set-method="setOrderNumber" />
>         <collection name="order-items" create-type="java.util.ArrayList"
>                     get-method="getItems" set-method="setItems" />
>     </mapping>
>
>
> Which gives this exception...
>
> java.lang.ClassCastException: OrderItem incompatible with
> org.jibx.runtime.IMarshallable
>     at JiBX_MungeAdapter.JiBX_binding_mapping_marshal_1_2()
>     at JiBX_MungeAdapter.JiBX_binding_mapping_marshal_1_3()
>     at Customer.JiBX_binding_mapping_marshal_1_0(Customer.java)
>     at JiBX_binding_mappingCustomer_access.marshal()
>     at Customer.marshal(Customer.java)
>     at org.jibx.runtime.impl.MarshallingContext.marshalRoot
> (MarshallingContext.java:1044)
>     at
> org.jibx.runtime.impl.MarshallingContext.marshalDocument(MarshallingContext.java:1114)
>     at TestHarness.main(TestHarness.java:32)
>
>
> The mapping does work if I use the concrete class instead of the
> interface! 
>
> This is the first time I've used Jibx so I'm not sure if I'm just
> missing an option on one of the mapping elements that will make this
> magically work or if I really just need to either use the
> implementation class or duplicate the structure when I need to.
>
> Any insight would be much appreciated!  I can provide the full
> interface, implementation, and binding if it would help.
>
> Zach Paul
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >>  http://get.splunk.com/
> ------------------------------------------------------------------------
>
> _______________________________________________
> jibx-users mailing list
> jibx-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jibx-users
>   

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
jibx-users mailing list
jibx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to