I guest my question should be how I should annotate non-containment reference links...
For example, an Order has a "Customer customer" member, when converting an Order object to XML, I only want to have a something like: <order> <name>holiday_purchase</name> <customer>simon</customer> </order> where "simon" is a unique identifier for a Customer object. How should I annotate "Customer getCustomer()" within the Order class? Thanks. -Simon On Thu, Apr 7, 2011 at 12:36 PM, Sergey Beryozkin <[email protected]> wrote: > > > 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 >> > >> > > > >
