Hi I've updated WADLGenerator to check for Aegis IgnoreProperty or JAXB XmlTransient when listing bean properties as WADL request/representation parameters. If you use 2.2.6 then you can do the following workaround : extend WADLGenerator and override a protected doWriteParam(...) method so that it delegates to the super class in all cases but when a paramName matches some well-known ignorable properties and then register this custom WADLGenerator as a jaxrs provider
thanks, Sergey Sharma, Abhishek wrote: > > Thanks Sergey for the extensive explanation. > > For now excluding the property is my biggest concern. Please let me know > if there is some solution for the same. > > Please see my comments inline.... > > Regards, > Abhishek > > -----Original Message----- > From: Sergey Beryozkin [mailto:[email protected]] > Sent: Thursday, February 18, 2010 5:26 PM > To: [email protected] > Cc: Sharma, Abhishek > Subject: Re: how to send Nested object in RESTful webservice > > Hi, thanks for the clarification, lets move the discussion back to the > users list... > > Please see my comments inline... > > cheers, Sergey > > ----- Original Message ----- > From: Sharma, Abhishek > To: Sergey Beryozkin > Sent: Thursday, February 18, 2010 8:10 AM > Subject: RE: how to send Nested object in RESTful webservice > > > Yes I've requirements like this: > > public Emsnamespace add(@FormParam("") Emsnamespace namespace, > @FormParam("") Product product) > >> S.B : I'm not sure having multiple aggregating @FormParam("") parameters >> will work. It might work but I'm not really sure. The >> idea of having a @FormParam("") (or QueryParam(""), etc) is to have all >> the available name/value pairs in the request body (for >> FormParam) or in the URI (for QueryParam or PathParam) injected into a >> bean like Emsnamespace or Product which can have nested >> types if needed but the important thing is that as far as the request >> body or uri is concerned is is still name/value pairs that >> are expected (exception : templateVarName to corresponding captured value >> pairs in case of PathParam("")). > > [A.S]: Multiple @FormParam works fine and is not a problem till the time > there is no ambiguity on param names. I feel that's fine as REST wants > name-value params in request so it's my web methods which are not designed > considering unique param name so probably won't work with REST. So its > violating REST basic principle and CXF or any other framework can't help. > > > Problem 1 > Now the problem is the WADL generated have two namespaceName param from > both the POJOs resulting in injection error. This type of > issues are also causing cyclic dependency error in some of the web > methods. > >> S.B : When you say an injection error occurs, what do you mean ? Do you >> have SOAP UI invoking ? What exactly is happening ? Can >> you capture what is being posted on the wire ? > > > [A.S] I was using Fiddler This is the error I was getting: > Payload: Method getNamespaceName injection failure > > >> S.B : Note, given the above, having multiple @FormParam("") will probably >> work after all provided you are actually doing a *form >> submission*, that is you have a request body containing a sequence of >> name/value pairs. The fact that the WADL fragment shows few >> duplicates in this case should not make a difference, Emsnamespace >> should get its setters invoked and Product have its setters >> invoked. You'd probably be better off trying to have a single complex >> FormParam("") parameter which will accumulate all the form >> data and then internally populate Emsnamespace and Product. > > I want to suppress the namespaceName in Product by using property like > @IgnoreProperty(Worked for WSDL). > >> S.B : In WADL it is either JAXBContext which can be used to generate a >> schema or starting from 2.2.7-SNAPSHOT, one can point to >> the existing schemas which can be inlined or linked to. I'm not planning >> to do some manual schema generation so that cretain >> properties get excluded in the schema. > > By the way, the types which you use are not qualified so the generated > schema is a bit broken. Aegis will create a custom namespace > but it is not that WADLGenerator will do...I think I might try extending > WADLGenerator to ask ProviderFactory for a provider capable > of handling XML and then delegate to them to generate the schema...So then > AegisProvider can get extended a bit and have the schema > generated... > > Also, as far as WADL and FormParam("") is concerned, it might make sense > to have certain properties excluded. > > > [A.S] for now excluding the property is my biggest concern. As for sending > a single object inside an object URL like (see emsnamespace.namespaceId): > > /catalogServiceRest/catalogServiceRest/add?productname=Abhishek&version=1.1&emsnamespace.namespaceId=1 > > Works for me. So the nested object is something working in the manner as > we write query in hibernate query language. > > > Problem 2 > I also have requirement to set collection of child elements in a request. > For e.g. see the Collection of product inside namespace. > WADL says products has to be sent as a query parameter. I don't know how > to send this nested collection as a query parameter in case > of REST. > >> S.B. FormParams get translated to parameters of type 'query'. Do you >> really need @FormParams after all ? > > [A.S] I will do more trial on this as I am able to run One2One objects in > HQL like style and will try for collections. Will update if I find some > solution. > > > Thanks > Abhishek > > WADL Snippet: > > <xs:complexType name="emsnamespace"> > <xs:sequence> > <xs:element name="deployed" type="xs:boolean" /> > <xs:element maxOccurs="unbounded" minOccurs="0" name="featureSets" > nillable="true" type="featureSet" /> > <xs:element maxOccurs="unbounded" minOccurs="0" name="features" > nillable="true" type="feature" /> > <xs:element minOccurs="0" name="namespaceDescription" type="xs:string" > /> > <xs:element name="namespaceId" type="xs:int" /> > <xs:element minOccurs="0" name="namespaceName" type="xs:string" /> > <xs:element maxOccurs="unbounded" minOccurs="0" name="products" > nillable="true" type="product" /> > <xs:element maxOccurs="unbounded" minOccurs="0" name="suites" > nillable="true" type="suite" /> > </xs:sequence> > </xs:complexType> > > > - <resource path="/add2"> > - <method name="POST"> > - <request> > - <representation mediaType="application/json"> > > > > > > > > > > > > > > > > > > > > </representation> > </request> > - <response> > <representation mediaType="application/json" /> > <representation mediaType="application/xml" /> > </response> > </method> > </resource> > > > > > WSDL SNIPPET: > > - <xsd:complexType name="Emsnamespace"> > <xsd:sequence> > <xsd:element minOccurs="0" name="namespaceDescription" nillable="true" > type="xsd:string" /> > <xsd:element minOccurs="0" name="namespaceId" type="xsd:int" /> > <xsd:element minOccurs="0" name="namespaceName" nillable="true" > type="xsd:string" /> > </xsd:sequence> > </xsd:complexType> > > > -----Original Message----- > From: Sergey Beryozkin [mailto:[email protected]] > Sent: Wednesday, February 17, 2010 4:50 PM > To: Sharma, Abhishek > Subject: Re: how to send Nested object in RESTful webservice > > Hi > > do you have > > @FormParam("") Product or @FormParam("") Emsnamespace > > in one of your resource methods ? > > cheers, Sergey > > ----- Original Message ----- > From: "Sharma, Abhishek" <[email protected]> > To: "Sergey Beryozkin" <[email protected]> > Sent: Wednesday, February 17, 2010 11:16 AM > Subject: RE: how to send Nested object in RESTful webservice > > > Hi Sergey, > > > Attached are the two files Emsnamespace and Product. > > import org.apache.cxf.aegis.type.java5.IgnoreProperty; > > property over a getter method removes the property from being exposed from > XSD in WSDL. > > Thanks > Abhishek > > -----Original Message----- > From: Sergey Beryozkin [mailto:[email protected]] > Sent: Wednesday, February 17, 2010 4:38 PM > To: [email protected] > Subject: Re: how to send Nested object in RESTful webservice > > Thanks, can you actually send the actual class (Employee + Manager) > (directly to me) ? > > What is the @IgnoreProperty ? I've never heard of it, how do you use it ? > Regarding the exceptions handling : > http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Exceptionhandling > > cheers, Sergey > ----- Original Message ----- > From: "Sharma, Abhishek" <[email protected]> > To: <[email protected]> > Sent: Wednesday, February 17, 2010 10:59 AM > Subject: RE: how to send Nested object in RESTful webservice > > > Thanks Sergey for prompt reply > > I changed the name of objects from > > Product to Employee > and Namespace to Manager, in order to clearly convey my problem. > > I was able to run the code with emsnamespace.namespaceId=5 as query param. > > I've attached the WADL file. Also request you to please answer the > remaining questions as well. > Also how can I send a collection in request param? > > > Thanks > Abhishek > > > > -----Original Message----- > From: Sergey Beryozkin [mailto:[email protected]] > Sent: Wednesday, February 17, 2010 4:19 PM > To: [email protected] > Subject: Re: how to send Nested object in RESTful webservice > > Hi > > Can you please post a sample resource class and this Employee object ? > @FormParams get translated to WADL parameters of type > 'query'...FormParam("") should result in individual Employee properties > such > as 'manager' being listed as parameters, but I'd like to 'manager' > actually refers to another complex object or not... > > cheers, Sergey > > ----- Original Message ----- > From: "Sharma, Abhishek" <[email protected]> > To: <[email protected]> > Sent: Wednesday, February 17, 2010 10:13 AM > Subject: how to send Nested object in RESTful webservice > > > I am planning to use CXF as my Webservice development framework. The java > code is already written using spring and hibernate. The > requirement is to expose the service layer in Model as web service and > their method as web methods in probably both SOAP and REST. > > As a proof of concept I found CXF to work excellently with my application > but I've still some open issues/questions: > > > Questions specific to RESTful web services: > > > 1. We have @IgnoreProperty for SOAP based services what is the > corresponding property for RESTful mode? > 2. How to send Nested object in REST? > > Details: I've to add an employee which has a @ManyToOne relationship with > the manager object. Now WADl says > . > > How can I send the entire object as query parameter? I've used > add(@FormParam("") Employee employee) web method to publish. > > Or Do I need to put any annotation over getManager() in my Employee pojo? > > > 1. How to do exception handling for REST like we have SOAPFault in soap > based webservices > > > Question specific to General design: > > In my web methods I am passing entire object while search/update. For now > code is using only a few values inside the object and > ignoring the rest. What should be the behavior in case of webservice as > the client might pass values in request which are actually > ignored by the web method. For this I just want to know what standard web > service architecture recommends? > > Thanks for help > > Regards, > Abhishek > > > > > > > The information contained in this electronic mail transmission > may be privileged and confidential, and therefore, protected > from disclosure. If you have received this communication in > error, please notify us immediately by replying to this > message and deleting it from your computer without copying > or disclosing it. > > = > > > The information contained in this electronic mail transmission > may be privileged and confidential, and therefore, protected > from disclosure. If you have received this communication in > error, please notify us immediately by replying to this > message and deleting it from your computer without copying > or disclosing it. > > > > The information contained in this electronic mail transmission > may be privileged and confidential, and therefore, protected > from disclosure. If you have received this communication in > error, please notify us immediately by replying to this > message and deleting it from your computer without copying > or disclosing it. > > > The information contained in this electronic mail transmission > may be privileged and confidential, and therefore, protected > from disclosure. If you have received this communication in > error, please notify us immediately by replying to this > message and deleting it from your computer without copying > or disclosing it. > > The information contained in this electronic mail transmission > may be privileged and confidential, and therefore, protected > from disclosure. If you have received this communication in > error, please notify us immediately by replying to this > message and deleting it from your computer without copying > or disclosing it. > > > > > -- View this message in context: http://old.nabble.com/how-to-send-Nested-object-in-RESTful-webservice-tp27621600p27652364.html Sent from the cxf-user mailing list archive at Nabble.com.
