Hi

On Fri, Feb 4, 2011 at 8:51 AM, Celinio <[email protected]> wrote:

> Building REST style web services
>
> Hi,
> I am a bit new to CXF and wondering what is the recommended way to build
> REST style web services with CXF now.
>
> I simply decorated my method with the @Get and @HttpResource annotations:
>
>     @WebService
> public interface IBMICalculator {
>
>     @Get
>     @HttpResource(location = "/computeBMI/{weight}/{height}")
>     public  double computeBMI(@WebParam(name="weight") double weight,
> @WebParam(name="height") double height) ;
> }
>
> I imported the binding extension xml file in my spring xml configuration
> file, cxf.xml:
> <import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml"/>
>
> And i declared an endpoint :
>  <jaxws:endpoint id="calcBMI"
>                   implementor="com.company.bmi.services.IBMICalculatorImpl"
>                   address="/cxfBmi"
>                   bindingUri="http://apache.org/cxf/binding/http";>
>                   <jaxws:serviceFactory>
>            <bean
> class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
>                <property name="wrapped" value="true" />
>            </bean>
>        </jaxws:serviceFactory>
>    </jaxws:endpoint>
>

Here's an alternative approach, using JAX-RS

@Path("/")
public interface IBMICalculator {

    @GET
    @Path("/computeBMI/{weight}/{height}")
    @Produces("text/plain")
    public  double computeBMI(@QueryParam("weight") double weight,
@QueryParam("height") double height) ;
}

<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>

<jaxrs:endpoint serviceClass="com.company.bmi.services.IBMICalculatorImp
                          address="/cxfBmi"/>

though the endpoint declaration may be more involved.


>
> It works like a charm. However I read that "This binding has been
> deprecated and is likely to be removed from CXF in one of its future
> releases"
> https://cwiki.apache.org/CXF20DOC/http-binding.html
>
>
the reason it was deprecated was that it was maintained and unlikely to be
maintained


> So what is the recommanded way to build REST style web services with CXF
> now ?
>

Please see the JAX-RS section : http://cxf.apache.org/docs/jax-rs.html

The only restriction of JAX-RS compared to the HTTP binding is that no
wrapping/unwrapping is supported. Example,

@Produces("text/plain")
 public  double computeBMI(@QueryParam("weight") double weight,
@QueryParam("height") double height) ;

@Produces("text/plain") is the hint to the runtime that the 'double'
response value needs to be returned as is, without wrapping into something
like
<response>12.3</response>

If the response wrapping is needed then a custom JAX-RS provider can easily
deal with wrapping the response.

However, if we had say

@Consumes("text/xml")
@POST
public  void addItem(double weight, double height) ;

where the weight and height are not query parameters but have been unwrapped
from XML such as

<item>
<weight>123</weight>
<height>123</height>
</item>

then it definitely won't work in JAX-RS.
Having

@Consumes("text/xml")
@POST
public  void addItem(Item item) ;

will do better....


Hope that helps, Sergey


> Thanks for helping.
>
>
>

Reply via email to