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: [email protected]
> 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