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...
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 > >
