Sadhana-
I am doing similar to this. You can follow the same, if you wish (I have
not tested this. But, I have a running app like this. I quickly
customized this to respond to your question. Sergey and other CXF active
developers may have more insights)
STEP 1: Write some interface like this. You may or may not need
@FormParam depending on whether you use it at web or not. I suggest you
start first using no @FormParam method first.
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
@Path("/users")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public interface SomeService {
@POST
@Path("/createuser")
@Consumes({"application/x-www-form-urlencoded"})
@Produces({"application/json", "application/xml"})
public User createUser(@FormParam("UserRequest")UserRequest
userRequest) ;
//Use this first
@POST
@Path("/createuser")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public User createUser(UserRequest userRequest) ;
}
STEP 2: Implement the above class for your app.
STEP 3:Your cxf-bean.xml may look like this.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/configuration/security
http://cxf.apache.org/schemas/configuration/security.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import
resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"
/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
<bean id="someService" class="SomeServiceImpl" />
<jaxrs:server id="restServices" address="/">
<jaxrs:serviceBeans>
<ref bean="someService" />
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
STEP 4
Then your url may look like http://xxx:8080/web-context/users/createuser
STEP 5:
Always try to see wadl in browser..before testing.
You can see wadl like this (you need cxf-2.2.3.jar file)
http://xxx:8080/web-context/?_wadl&_type=xml (see a underscore before
wadl and type)
STEP 6: Then, you can test this using some client as shown below
package com.javaclient.testrest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class JavaClientUserAPI {
public static void main(String args[]) throws Exception {
String fileName = "C:\\\\createuser.txt"; //This is
where your will have json content
URL url = null;
HttpURLConnection httpURLConnection = null;
OutputStreamWriter outputStreamWriter = null;
try {
url = new
URL("http://xxx:8080/web-context/users/createuser");
);
httpURLConnection = (HttpURLConnection)
url.openConnection();
httpURLConnection.setRequestMethod("PUT");
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setAllowUserInteraction(false);
httpURLConnection.setRequestProperty(
JavaClientConstant.CONTENT_TYPE,
"application/json");
httpURLConnection.setRequestProperty(
JavaClientConstant.CONTENT_LANGUAGE,
JavaClientConstant.CONTENT_LANGUAGE_VALUE);
//httpURLConnection.setRequestProperty("Accept",
"application/*");
outputStreamWriter = new
OutputStreamWriter(httpURLConnection
.getOutputStream());
outputStreamWriter.write(FileReader.readFile(fileName));
outputStreamWriter.flush();
outputStreamWriter.close();
outputStreamWriter = null;
InputStream inputStream = null;
BufferedReader bufferedReader = null;
inputStream =
httpURLConnection.getInputStream();
bufferedReader = new BufferedReader(new
InputStreamReader(
inputStream));
String line;
StringBuilder response = new StringBuilder();
while ((line = bufferedReader.readLine()) !=
null) {
response.append(line);
response.append('\r');
}
System.out.println(response.toString());
bufferedReader.close();
bufferedReader = null;
inputStream.close();
inputStream = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
Regards
Karuna Pydipati
StubHub/eBay - Platform & Services
Phone: (415)222-8752
Email: [email protected]
-----Original Message-----
From: Sadhana Jain [mailto:[email protected]]
Sent: Tuesday, September 15, 2009 12:25 PM
To: [email protected]
Subject: RE: JAX-RS POST method example
The error I am getting is ".No operation matching request path...."
though @POST is there with the @PATH annotation that should match.
Thanks.
Sadhana Jain
Sr. Software Engineer
Rovi Corporation
795 Folsom St, Suite 200
San Francisco, CA 94107
Direct: 415.247.5023 | Mobile: 925.212.6495 [email protected]
rovicorp.com
Rovi. The new name for Macrovision.
-----Original Message-----
From: Sadhana Jain [mailto:[email protected]]
Sent: Tuesday, September 15, 2009 12:16 PM
To: [email protected]
Subject: JAX-RS POST method example
Hi All,
I am new to using JAX-RS and CXF. I was wondering if anyone can point me
To an example that uses POST method as I am running into a problem when
using POST. Cxf is not able to match to request uri to a method
annotated with @POST though @GET works ok.
Does anyone know a known issue using POST?
Any sample code will be great help.
Thanks,
Sadhana
Sadhana Jain
Sr. Software Engineer
Rovi Corporation
795 Folsom St, Suite 200
San Francisco, CA 94107
Direct: 415.247.5023 | Mobile: 925.212.6495 [email protected]
rovicorp.com
Rovi. The new name for Macrovision.
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Tuesday, September 15, 2009 9:30 AM
To: Pydipati, Karuna; [email protected]; Sergey Beryozkin
Subject: Re: CXF -Strange HTTP PUT (REST) behavior
Hi,
@FormParams can only be used to refer to field values in form
submissions, with application/x-www-form-urlencoded (or similar).
In your case you just need to remove @FormParam. A given JAXRS method
can refer to a request body (sent as part of POST or PUT. etc) by either
not annotating a given parameter with JAXRS param annotations, like this
:
@PUT
@Path("{userGuid}/contacts/{contactId}")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"}) public Response
updateContact(@PathParam("userGuid")String userGuid,
@PathParam("contactId")String contactId, UserContact contact);
or by annotating parameters with @FormParam as in your case but note a
different @Consumes value :
@Consumes("application/x-www-form-urlencoded")
@Produces({"application/json", "application/xml"}) public Response
updateContact(@PathParam("userGuid")String userGuid,
@PathParam("contactId")String contactId,
@FormParam UserContact
contact);
So if you need to your web app to handle both 'plain' requests and form
requests (those meeting application/x-www-form-urlencoded rules,
name=value pairs) then you need to have both methods as suggested above,
otherwise the updated first method will do.
cheers, Sergey
----- Original Message -----
From: Pydipati, Karuna
To: Sergey Beryozkin ; [email protected] ; Sergey Beryozkin
Sent: Tuesday, September 15, 2009 4:40 PM
Subject: RE: CXF -Strange HTTP PUT (REST) behavior
Thanks a lot Sergey for your quick response.
Yes, you right. We have the following method
@PUT
@Path("{userGuid}/contacts/{contactId}")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public Response updateContact(@PathParam("userGuid")String userGuid,
@PathParam("contactId")String contactId,
@FormParam("contact")UserContact contact);
What you are suggesting is that we should have another method like
this
@PUT
@Path("{userGuid}/contacts/{contactId}")
public Response updateContact(@PathParam("userGuid")String userGuid,
@PathParam("contactId")String contactId,
@FormParam("contact")UserContact contact);
My question is...how is it working..if I package in another buy.ear or
cog.ear files ....where as it fails userapi.ear? I am still grappling
with this puzzle. Pardon my ignorance on @FormParam and Content-type
area. Could you elaborate your answer a bit further?
Regards
Karuna Pydipati
StubHub/eBay - Platform & Services
Phone: (415)222-8752
Email: [email protected]
------------------------------------------------------------------------
------
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Tuesday, September 15, 2009 2:32 AM
To: Pydipati, Karuna; [email protected]; Sergey Beryozkin
Subject: Re: CXF -Strange HTTP PUT (REST) behavior
Hi
What is most likely happening is that you have a method parameter
annotated with @FormParam.
In that case no message body readers are checked (which would've
prevented the NPE) but the runtime checks if its a
application/x-www-form-urlencoded request and if not then it assumes
straight away it's a mulltipart/form-data request (so this will have to
be fixed so that an unsupported media type exception is thrown instead).
So you just need to remove @FormParams from the @PUT-annotated method.
If you do need to keep @FormParams, then just introduce another method
which accepts PUT and application/json (@Consumes) media type
hope it helps, Sergey
----- Original Message -----
From: Pydipati, Karuna
To: [email protected] ; Sergey Beryozkin
Sent: Tuesday, September 15, 2009 6:28 AM
Subject: CXF -Strange HTTP PUT (REST) behavior
Hi
I posted this in a separate thread today. Sorry. After some
investigation, I found this. Please help me.
I see a strange behavior in HTTP PUT (REST). When I tried CXF-2.2.2
deploying userapi.ear (with "user" as context-root in jboss), it is
failing with following error. If I rename same ear file to something
else such as cog.ear (with 'cog' as context-root), it started working.
Is 'user' a reserve word in HTTP/CXF/REST world? Can't I use "user' word
for my application for "Address"?
[in my app, cog.ear contains cog.war. Same way, user.ear contains
user.war too]
17:28:54,290 ERROR [STDERR] Sep 14, 2009 5:28:54 PM
org.apache.cxf.interceptor.LoggingInInterceptor logging
INFO: Inbound Message
----------------------------
ID: 3
Address:
/userapi/user/users/6E2D6D23D40D2FC9E04400144F8AE084/contacts/2
Encoding: UTF-8
Content-Type: application/json
Headers: {content-length=[536], connection=[keep-alive],
cache-control=[no-cache], host=[localhost:28080], user-agent=[J
ava/1.5.0_14], pragma=[no-cache], Content-Type=[application/json],
content-type=[application/json], Accept=[text/html, i mage/gif,
image/jpeg, *; q=.2, */*; q=.2], content-language=[en-US]}
Payload: { "UserContact": { "ContactId": 111111, "UserId": 11111,
"FirstName": "xxxxxx",
"LastName": "xxxxxx", "Street": "Sharynne Ln.", "AptNumber": 5350,
"City": "Malibu",
"State": "CA", "Zip": 90265, "Phone1": "xxxxxxx", "Phone2":
"xxxxxxx", "Company": "Ebay", "Email": "[email protected]", "DateAdded":
"24-OCT-02", "Active": 1, "Note": "Note", "Fax": "56356", "Country":
"US",
"DefaultContact": 1, "PaymentContact": 1, "Title":"Mr.",
"LastModifiedDate": "10-SEP-09", "ChkPmtToCo": 0
}}
--------------------------------------
17:28:54,290 ERROR [STDERR] Sep 14, 2009 5:28:54 PM
org.apache.cxf.phase.PhaseInterceptorChain doIntercept
INFO: Interceptor has thrown exception, unwinding now
java.lang.NullPointerException
at
org.apache.cxf.attachment.AttachmentUtil.createAttachment(AttachmentUtil
.java:136)
at
org.apache.cxf.jaxrs.ext.MessageContextImpl.createAttachments(MessageCon
textImpl.java:135)
at
org.apache.cxf.jaxrs.ext.MessageContextImpl.get(MessageContextImpl.java:
58)
at
org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils.getMultipartBody(At
tachmentUtils.java:54)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processFormParam(JAXRSUtils.java:5
90)
Regards
Karuna Pydipati
StubHub/eBay - Platform & Services
Phone: (415)222-8752
Email: [email protected]