...
CXF also supports _type query as an alternative to appending extensions like '.xml' to request URIs :
GET /resource?_type=xml
Logging
Existing CXF features can be applied to jaxrs:server, whenever it makes sense.
To enable logging of requests and responses, simply do :
Code Block | ||||
---|---|---|---|---|
| ||||
<jaxrs:server>
<jaxrs:features>
<cxf:logging/>
</jaxrs:features>
<jaxrs:server>
|
Filters
CXF suports filters. Often it's necessary to pre- or post-process some requests according to a number of requirements.
For example, a request like
...
Code Block | ||||
---|---|---|---|---|
| ||||
<beans> <jaxrs:server id="customerService" address="/"> <jaxrs:serviceBeans> <bean class="org.CustomerService" /> </jaxrs:serviceBeans> <jaxrs:providers> <ref bean="authorizationFilter" /> </jaxrs:providers> <bean id="authorizationFilter" class="com.bar.providers.AuthorizationRequestHandler"> <!-- authorization bean properties --> </bean> </jaxrs:server> </beans> |
Advanced HTTP
CXF provides a partial support for an advanced content type negotiation by handling If-Match headers and ETags in its JAX-RS Request implementation. Neither If-Modified-Since nor Vary headers are currently supported.
Difference between JAXRS filters and CXF interceptors
JAXRS runtime flow is mainly implemented by a pair of 'classical' CXF interceptors. JAXRSInInterceptor is currently at Phase.PRE_STREAM phase while JAXRSOutInterceptor is currently at Phase.MARSHAL phase.
JAXRS filters can be thought of as additional handlers. JAXRSInInterceptor deals with a chain of RequestHandlers, just before the invocation. JAXRSOutInterceptor deals with a chain of ResponseHandlers, just after the invocation but before message body writers get their chance.
Sometimes you may want to use CXF interceptors rather than writing JAXRS filters. For example, suppose you combine JAXWS and JAXRS and you need to log only inbound or outbound messages. You can reuse the existing CXF interceptors :
Code Block | ||||
---|---|---|---|---|
| ||||
<beans>
<bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<jaxrs:server>
<jaxrs:inInterceptors>
<ref bean="logInbound"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="logOutbound"/>
</jaxrs:outInterceptors>
</jaxrs:server>
<jaxws:endpoint>
<jaxws:inInterceptors>
<ref bean="logInbound"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<ref bean="logOutbound"/>
</jaxws:outInterceptors>
</jaxws:endpoint>
</beans>
|
Reusing other CXF interceptors/features such as GZIP handlers can be useful too.
Advanced HTTP
CXF JAXRS provides a partial support for an advanced content type negotiation by handling If-Match, If-Modified-Since and ETags headers. JAXRS Request context object can be used to check the preconditions. Vary headers are currently not supported. It also supports CacheControl and Cookies.
...