...
@Path annotation is applied to resource classes or methods. The value of @Path annotation is a relative URI path follows the URI Template format.
More information about Path annotations can be found from JAX-RS spec section 2.3.
...
A HTTP GET request to http://localhost:9000/customerservice/orders/223/products/323 is dispatched to getOrder method first. If the Order resource whose id is 223 is found, the Order 223 will be used to further resolve Product resource. Eventually, a Product 323 that belongs to Order 223 is returned., the Order 223 will be used to further resolve Product resource. Eventually, a Product 323 that belongs to Order 223 is returned.
Message Body Providers
JAX-RS relies on MessageBodyReader and MessageBodyWriter implementations to serialize and de-serialize Java types. JAX-RS requires that certain types has to be supported out of the box.
By default, CXF supports String, byte[], InputStream, File, JAXP Source, JAXB-annotated types with application/xml and application/json formats (see below). JAX-RS MultivaluedMap is also supported for
form contents. Support for other types like Reader and StreamingOutput is on the way.
Custom Message Body Providers
It's likely that a given application may need to deal with types which are not supported by default.
Alternatively, developers may want to provide a more efficient support for handling default types such as InputStream.
Here's an example of a custom MessageBodyReader for InputStream (0.7 jax-rs api) :
Code Block | ||||
---|---|---|---|---|
| ||||
@ConsumeMime("application/octet-stream")
@Provider
public class InputStreamProvider implements MessageBodyReader<InputStream> {
public boolean isReadable(Class<InputStream> type, Type genericType, Annotation[] annotations) {
return InputStream.class.isAssignableFrom(type);
}
public InputStream readFrom(Class<InputStream> clazz, Type t, MediaType mt,
Annotation[] a, MultivaluedMap<String, String> headers, InputStream is)
throws IOException {
return new FilterInputStream(is) {
@Override
public int read(byte[] b) throws IOException {
// filter out some bytes
}
}
}
}
|
and here's an example of a custom MessageBodyWriter for Long (0.7 jax-rs api) :
Code Block | ||||
---|---|---|---|---|
| ||||
@ProduceMime("text/plain")
@Provider
public class LongProvider implements MessageBodyWriter<Long> {
public long getSize(Long l) {
return -1;
}
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations) {
return long.class.isAssignableFrom(type) || Long.class.isAssignableFrom(type);
}
public void writeTo(Long l, Class<?> clazz, Type type, Annotation[] a,
MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os)
throws IOException {
os.write(l.toString().getBytes());
}
|
Registering custom providers
Putting @Provider annotation on the provider class is something that should lead to your provider being registered with the runtime. CXF does not support this feature yet. One can easily register a provider either from the Spring configuration :
Code Block | ||||
---|---|---|---|---|
| ||||
<beans>
<jaxrs:server id="customerService" address="/">
<jaxrs:entityProviders>
<bean ref="isProvider" />
<bean ref="longProvider" />
</jaxrs:entityProviders>
<bean id="isProvider" class="com.bar.providers.InputStreamProvider"/>
<bean id="longProvider" class="com.bar.providers.LongProvider"/>
</jaxrs:server>
</beans>
|
Content type negotiation
One of the coolest thing of REST is that the same resource can be served using multiple representations. @ProduceMime and @ConsumeMime annotations are used to declare the supported request and response media types.
...
Code Block | ||||
---|---|---|---|---|
| ||||
<?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:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.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-servlet.xml" /> <jaxrs:server id="customerService" address="/"> <jaxrs:serviceBeans> <bean class="demo.jaxrs.server.CustomerService" /> </jaxrs:serviceBeans> </jaxrs:server> </beans> |