Java Reference
In-Depth Information
public
public interface
interface
WriterInterceptor
WriterInterceptor
{
void
void
aroundWriteTo
(
WriterInterceptorContext context
)
throws
throws
java
.
io
.
IOException
,
javax
.
ws
.
rs
.
WebApplicationException
;
}
These interceptors are only triggered when a
MessageBodyReader
or
MessageBodyWriter
is
needed to unmarshal or marshal a Java object to and from the HTTP message body. They
also are invoked in the same Java call stack. In other words, a
ReaderInterceptor
wraps
around the invocation of
MessageBodyReader.readFrom()
and a
WriterInterceptor
wraps around the invocation of
MessageBodyWWriter.writeTo()
.
A simple example that illustrates these interfaces in action is adding compression to your in-
put and output streams through content encoding. While most JAX-RS implementations sup-
port GZIP encoding, let's look at how you might add support for it using a
ReaderInter-
ceptor
and
WriterInterceptor
:
@Provider
public
public class
class
GZIPEncoder
GZIPEncoder
implements
implements
WriterInterceptor
{
public
public
void
void
aroundWriteTo
(
WriterInterceptorContext ctx
)
throws
throws
IOException
,
WebApplicationException
{
GZIPOutputStream os
=
new
new
GZIPOutputStream
(
ctx
.
getOutputStream
());
ctx
.
getHeaders
().
putSingle
(
"Content-Encoding"
,
"gzip"
);
ctx
.
setOutputStream
(
os
);
ctx
.
proceed
();
return
return
;
}
}
The
WriterInterceptorContext
parameter allows you to view and modify the HTTP
headers associated with this invocation. Since interceptors can be used on both the client and
server side, these headers represent either a client request or a server response. In the ex-
ample, our
aroundWriteTo()
method uses the
WriterInterceptorContext
to get and re-
place the
OutputStream
of the HTTP message body with a
GZipOutputStream
. We also use
it to add a
Content-Encoding
header. The call to
WriterInterceptorContext.proceed()
will either invoke the next registered
WriterInterceptor
, or if there aren't any, invoke the
underlying
MessageBodyWriter.writeTo()
method.
Let's now implement the
ReaderInterceptor
counterpart to this encoding example:
@Provider
public
public class
class
GZIPDecoder
GZIPDecoder
implements
implements
ReaderInterceptor
{
public
public
Object
aroundReadFrom
(
ReaderInterceptorContext ctx
)