I found out, that if I specify a custom entity handler:
@Provider
@Produces('text/xml')
class NoteListWriter extends MessageBodyWriterSupport<ArrayList>
{
void writeTo(ArrayList<Note> entityList, MultivaluedMap
httpHeaders, OutputStream entityStream) {
println "entityList=${entityList}"
if (entityList) {
def builder = new MarkupBuilder(new
OutputStreamWriter
(entityStream))
builder.notes {
for (Note entity: entityList) {
builder.note {
id(
entity.id)
content(entity.text)
}
}
}
}
// Alternative (default rendering):
// entityStream << (entity as XML)
}
}
and save it into grails-app/providers, I can specify the custom XML
and use
Response.ok(Note.findAll()).build()
in the NoteCollectionResource class for listing all notes.
The problem now is, that I have to use a wide generics type ArrayList:
class NoteListWriter extends MessageBodyWriterSupport<ArrayList> {
void writeTo(ArrayList<Note> entityList, MultivaluedMap
httpHeaders, OutputStream entityStream) {
. . .
If I try to use <ArrayList<Note>>:
class NoteListWriter extends MessageBodyWriterSupport<ArrayList<Note>>
{
void writeTo(ArrayList<Note> entityList, MultivaluedMap
httpHeaders, OutputStream entityStream) {
, the message body writer is not
found:
SEVERE: A message body writer for Java type, class
java.util.ArrayList, and MIME media type, text/xml, was not found
Sep 21, 2009 1:59:05 PM
com.sun.jersey.server.impl.application.WebApplicationImpl onException
SEVERE: Internal server error
javax.ws.rs.WebApplicationException
at com.sun.jersey.spi.container.ContainerResponse.write
(ContainerResponse.java:241)
even if the call for the method is of type ArrayList<Note>.
Of cource I could implement one message body writer (e.g.
ArrayListWriter) for all ArrayList's and the have one writeTo() method
for each list element type.
This just doesn't feel the right solution. Maybe there is a better way
of doing it?