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

Reply via email to