On Thu, Apr 7, 2011 at 5:28 PM, Simon Chen <[email protected]> wrote:
> Can you elaborate (or post a link) on this one? > > I am actually modifying the genmodel code (javajetinc files), such > that genmodel would add @XmlRootElement tags automatically. The > downside is that I don't know if I added enough of them, or indeed > where I should add to... > > I don't recall the details, may be David B can advise something :-) Cheers, Sergey > Thanks a lot for your input. I will try them. > > -Simon > > On Thu, Apr 7, 2011 at 12:22 PM, Sergey Beryozkin <[email protected]> > wrote: > > Actually, another option is to add a custom JAX-RS provider which handles > > Order/etc using the EMF itself (which will produce XMI - though it's a > > complex XML indeed) > > > > Sergey > > > > On Thu, Apr 7, 2011 at 5:21 PM, Sergey Beryozkin <[email protected]> > > wrote: > >> > >> Hi > >> > >> Please see comments inline > >> > >> On Thu, Apr 7, 2011 at 4:55 PM, Simon Chen <[email protected]> > wrote: > >>> > >>> I have some new findings... > >>> > >>> My class files are generated by EMF (ecore/genmodel). > >> > >> I guess it can help in time if CXF has an EMF binding or JAX-RS provider > >> > >>> > >>> Thus, I have > >>> both Customer.class and CustomerImpl.class. The code is as simple as: > >>> > >>> @XmlRootElement(name = "Customer") > >>> public class CustomerImpl implements Customer { > >>> private String name; > >>> private EList<Order> orders; > >>> public String getName() { > >>> return name; > >>> } > >>> public void setName(String name) { > >>> this.name = name; > >>> } > >>> public Order getOrder(String name) { > >>> // return the order with the specified name > >>> return null; > >>> } > >>> public void deleteOrder(String name) { > >>> // remove the order with the specified name > >>> } > >>> } > >>> > >>> @XmlRootElement(name = "Order") > >>> public class OrderImpl implements Order { > >>> private String name; > >>> private Customer customer; > >>> public String getName() { > >>> return name; > >>> } > >>> public void setName(String name) { > >>> this.name = name; > >>> } > >>> public Customer getCustomer() { > >>> return this.customer; > >>> } > >>> public void setCustomer(Customer c) { > >>> this.customer = c; > >>> } > >>> } > >>> > >>> > >>> The problem is that under "CustomerService" class, which contains a > >>> list of Customers and Orders, I have: > >>> > >>> @Path("/customerservice/') > >>> public class CustomerService { > >>> ... > >>> @POST > >>> @Path("/customers/") > >>> public Response addCustomer(Customer c) { > >>> ...... > >>> } > >>> .... > >>> } > >>> > >>> In this case, if I post a CustomerImpl object to > >>> "/customerservice/customers/", I have the error of "No message body > >>> reader has been found for request class Customer". If I change the > >>> function definition to be as follows, it works... > >>> @POST > >>> @Path("/customers/") > >>> public Response addCustomer(CustomerImpl c) { > >>> ...... > >>> } > >>> > >>> So, my first question is, is there a more elegant work-around such > >>> that "addCustomer" function would take "CustomerImpl" objects, even > >>> when the function parameter says "Customer c"? > >>> > >>> My second question is, let's say I want to post an "OrderImpl" object > >>> to "/customerservice/orders", but the OrderImpl object contains a > >>> reference to a customer. What is the best way to transfer the > >>> reference relationship between the client and the server? For some > >>> reason, the direct XML marshaling would ignore the reference. > >>> > >> > >> > >> Looks like it does not work because Order and Customer interfaces, > >> presumably generated by EMF, have no @XmlRootElement annotations > themselves. > >> > >> Adding these annotations to concrete implementations is problematic, as > >> you can add many components in EMF all the time. Some options to > consider: > >> > >> - I recall it is possible to add custom metadata to the EMF model. Is it > >> possible to have @XmlRootElement added to the generated interfaces ? > >> - Explicitly configure CXF JAXBElementProvider and set it to use > >> JAXBElement internally - that should handle types such as Customer and > >> Order, see > >> > http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-HandlingJAXBbeanswithoutXmlRootElementannotations > >> > >> Hope that helps > >> > >> Sergey > >> > >>> > >>> Thanks. > >>> -Simon > >>> > >>> > >>> > >>> On Thu, Apr 7, 2011 at 7:56 AM, Sergey Beryozkin <[email protected] > > > >>> wrote: > >>> > Hi Simon > >>> > > >>> > On Wed, Apr 6, 2011 at 10:59 PM, Simon Chen <[email protected]> > >>> > wrote: > >>> >> > >>> >> Hi all, > >>> >> > >>> >> I am trying to build a RESTful web service... In short, I am having > >>> >> trouble posting Java objects with member references from client side > >>> >> to server side. > >>> >> > >>> >> I have mostly followed the example under > >>> >> "apache-cxf-2.3.3/samples/jax_rs/basic". I have two major problems > >>> >> now... > >>> >> > >>> >> 1) Handle objects with references. For example, a customer may have > a > >>> >> list of orders, and an order may be linked back to a customer. So, > how > >>> >> can I (or indeed what is the best way to) post an "Order" object > with > >>> >> a link to a "Customer" object to "/customerservice/orders"? > >>> >> > >>> >> 2) The example uses annotations like "XmlRootElement" to enable sort > >>> >> of automated conversioning from java objects to XML/json data. But > >>> >> this conversion seems to be broken when I add references into a > class > >>> >> definition. For example, when I post an "Order" object to > >>> >> "/customerservice/orders", the server reports "No message body > reader > >>> >> has been found for request class Order", (even though the customer > ref > >>> >> is set to null). > >>> >> > >>> > > >>> > Is that Order class also annotated ? Can you post some sample > >>> > structures > >>> > showing what exactly you'd like to do ? > >>> > > >>> > Thanks, Sergey > >>> > > >>> >> > >>> >> Thanks. > >>> >> -Simon > >>> > > >>> > > >>> > > >> > >> > >> > >> -- > >> Sergey Beryozkin > >> > >> Application Integration Division of Talend > >> http://sberyozkin.blogspot.com > > > > >
