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://www.talend.com>
http://sberyozkin.blogspot.com

Reply via email to