cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Chen <simonche...@gmail.com>
Subject Re: passing objects with reference in jax-rs
Date Thu, 07 Apr 2011 16:28:05 GMT
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 <sberyozkin@gmail.com> 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 <sberyozkin@gmail.com>
> wrote:
>>
>> Hi
>>
>> Please see comments inline
>>
>> On Thu, Apr 7, 2011 at 4:55 PM, Simon Chen <simonchennj@gmail.com> 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 <sberyozkin@gmail.com>
>>> wrote:
>>> > Hi Simon
>>> >
>>> > On Wed, Apr 6, 2011 at 10:59 PM, Simon Chen <simonchennj@gmail.com>
>>> > 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
>
>

Mime
View raw message