Here you go, a brief document on how to build RESTful services in CXF using 
JAX-RS (JSR-311): 
http://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+%28JSR-311%29

BTW,  at the moment we do not support the return of a List in JAX-RS (e.g., 
List<ReviewData> getAllReviews() ), I am even not sure whether or not this 
should be supported. The main problem is a direct mapping from List to XML 
would result in an invalid XML as it has multiple root elements, thus can not 
be displayed on browsers. You will need a wrapper object, i.e., ReviewDataList 
getAllReviews(), where ReviewDataList is defined as:

@XmlRootElement(name = "ReviewDataList")
public class ReviewDataList {
    private Collection<ReviewData> rds;

    public Collection<ReviewData> getReviewData() {
        return rds;
    }

    public void setReviewData(Collection<ReviewData> r) {
        this.rds= r;
    }
}


Jervis

> -----Original Message-----
> From: Liu, Jervis [mailto:[EMAIL PROTECTED]
> Sent: 2007?11?8? 15:06
> To: cxf-user@incubator.apache.org
> Subject: RE: Programmatically publishing a REST endpoint
> 
> 
> Currently there are three ways to build a RESTful service in 
> CXF. [1] and [2] should give you enough information on how to 
> use CXF HTTP binding and JAX-WS Dispatch/Provider to build a 
> RESTful service. Now we have a third option - using JSR-311. 
> You are very welcome to try this new feature out, any 
> feedbacks would be hightly appreciated. This has not been 
> documented yet, but I will do this soon. At the same time, 
> there are couple of examples under system test directory [3], 
> which hopefully will help you out. 
> 
> To answer your specific question, if you want to use CXF HTTP 
> binding, you need to write your server mainline as below: 
> 
> JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
> sf.setServiceClass(PeopleService.class);
> sf.getServiceFactory().setWrapped(true);
> sf.setBindingId(HttpBindingFactory.HTTP_BINDING_ID);
> sf.setAddress("http://localhost:9001/";);
> 
> PeopleService peopleService = new PeopleServiceImpl();
> sf.getServiceFactory().setInvoker(new BeanInvoker(peopleService));
> 
> Server svr = sf.create();
> 
> Your RestReviewService.class suggests that you are actually 
> using JSR-311, in this case, your server main line is as below:
> 
>         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>         sf.setResourceClasses(RestReviewService.class);
>         //default lifecycle is per-request, change it to singleton
>         sf.setResourceProvider(RestReviewService.class, new 
> SingletonResourceProvider());
>         sf.setAddress("http://localhost:9001/";);
> 
>         sf.create();  
> 
> 
> [1]. http://cwiki.apache.org/CXF20DOC/http-binding.html
> [2]. 
> http://cwiki.apache.org/CXF20DOC/rest-with-jax-ws-provider-and
> -dispatch.html
> [3]. 
> https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/
> src/test/java/org/apache/cxf/systest/jaxrs
> 
> Hope this helps,
> Jervis
> 
> 
> 
> > -----Original Message-----
> > From: Tom Davies [mailto:[EMAIL PROTECTED]
> > Sent: 2007?11?8? 9:03
> > To: cxf-user@incubator.apache.org
> > Subject: Programmatically publishing a REST endpoint
> > 
> > 
> > Hi,
> > 
> > I have a SOAP services working fine, using the servlet 
> > transport. The  
> > servlet is configured in web.xml, and the end point 
> > publishing happens  
> > in the init method of the servlet (which is a subclass of 
> CXFServlet:
> > 
> > public void init(ServletConfig servletConfig) throws 
> > ServletException {
> >          super.init(servletConfig);
> >          Bus bus = this.getBus();
> >          BusFactory.setDefaultBus(bus);
> >          Endpoint.publish("/review",  
> > SpringContext.getComponent("rpcReviewService"));
> >     Endpoint e = Endpoint.create(HTTPBinding.HTTP_BINDING,  
> > SpringContext.getComponent("restReviewService"));
> >          e.publish("/rest");
> >          Endpoint.publish("/auth",  
> > SpringContext.getComponent("rpcAuthService"));
> >      }
> > 
> > My RestReviewService class (based on the CustomerService example)  
> > looks like:
> > 
> > @Component("restReviewService")
> > @WebService
> > @UriTemplate("/review/")
> > public class RestReviewService {
> >          @Autowired
> >          private ReviewService reviewService;
> > 
> >          @HttpContext
> >          UriInfo uriInfo;
> > 
> >          @HttpMethod("GET")
> >          @UriTemplate("/all/")
> >          public List<ReviewData> getAllReviews() {
> >              return reviewService.getAllReviews();
> >          }
> > }
> > 
> > When I start my server the log says:
> > ...
> > [java] Nov 8, 2007 11:34:53 AM  
> > org.apache.cxf.service.factory.ReflectionServiceFactoryBean  
> > buildServiceFromClass
> >       [java] INFO: Creating Service 
> > {http://rpc.spi.crucible.atlassian.com/ 
> > }RestReviewServiceService from class  
> > com.atlassian.crucible.spi.rpc.RestReviewService
> >       [java] Nov 8, 2007 11:34:53 AM  
> > org.apache.cxf.endpoint.ServerImpl initDestination
> >       [java] INFO: Setting the server's publish address to be /rest
> >       [java] Nov 8, 2007 11:34:53 AM  
> > org.apache.cxf.service.factory.ReflectionServiceFactoryBean  
> > buildServiceFromClass
> > ...
> > 
> > But the service endpoint seems to be another SOAP service, 
> as when I  
> > go to http://localhost:6060/foo/services/rest/review/all I get:
> > 
> > <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/ 
> > envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</ 
> > faultcode><faultstring>No such operation: review</faultstring></ 
> > soap:Fault></soap:Body></soap:Envelope>
> > 
> > Thanks for any tips or pointers to documentation other than 
> > http://cwiki.apache.org/CXF20DOC/rest-with-jax-ws-provider-and
> > -dispatch.html
> > 
> > I suspect I need to set the JAXRS binding for the endpoint, but I  
> > don't know how to do it...
> > 
> > Tom
> > 
> > --
> > ATLASSIAN - http://www.atlassian.com
> > Our products help over 8,500 customers in more than 95 
> countries to  
> > collaborate
> > 
> > 
> > 
> > 
> > 
> 
> ----------------------------
> IONA Technologies PLC (registered in Ireland)
> Registered Number: 171387
> Registered Address: The IONA Building, Shelbourne Road, 
> Dublin 4, Ireland
> 

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Reply via email to