I am seeing some really bizarre behavior for a jaxrs service I've written. I'm
a little at a loss at one's going on and this may not be the appropriate place
as it may be in the bowels of stax or my servlet api.
I am trying to stream a large resultset straight from my database to the
response output stream.
1. I get an iterator from my database.
2. Then I use stax to start my xml response document.
3. Then I loop over the iterator and use jaxb to marshal those objects to xml
directly to the output stream.
4. Finally I use stax again to close the document.
My service method looks like this:
@GET
@Path( "users/roles/{role}/marks/{mark}" )
@Produces( "application/xml" )
public void getUsersByRoleAndMark( @Context HttpServletResponse
response, @PathParam( "role" ) String role, @PathParam( "mark" ) String mark,
@QueryParam ("getRoles") @DefaultValue("false") String getRoles ) {
...
My marshalling code looks like this:
public void streamUsers(LoggedUserIterator users, OutputStream out) {
XMLOutputFactory xof = XMLOutputFactory.newInstance();
try {
XMLStreamWriter xtw = xof.createXMLStreamWriter(out);
xtw.writeStartDocument("utf-8","1.0");
xtw.setPrefix("sso",
"http://resources.sso.railinc.com/v1");
xtw.writeStartElement("http://resources.sso.railinc.com/v1","users");
xtw.writeNamespace("sso",
"http://resources.sso.railinc.com/v1");
xtw.writeCharacters("");
xtw.flush();
Marshaller m = this.jaxbCtx.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, true);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
while(users.hasNext()) {
LoggedUser loggedUser = users.next();
User user = convertToLocalUser(loggedUser);
m.marshal(user, out);
}
xtw.writeEndElement();
xtw.writeEndDocument();
xtw.flush();
out.flush();
xtw.close();
} catch (IOException e) {
logException(e);
throw500();
} catch (JAXBException e) {
logException(e);
throw500();
} catch (XMLStreamException e) {
logException(e);
throw500();
}
}
******* Now here is the weirdness:
If my results end up with more than 1 result in the iterator, it works fine.
If my results end up with only returning one user, I get an empty response with
a 200 code. I've tried the following:
1. Wrapped my OutputStream in one that also logs to a ByteArrayOutputStream
and yes it is writing the full XML document.
2. Change to use the writer instead of the OutputStream and this actually
works, but I get the dreaded IllegalStateException writer already obtained
(even though it seems to work).
3. Used tcpmonitor to confirm it is returning an empty result.
Any ideas? Any other mailinglist/boards I should pursue? Anyone else seen
this?
Thanks
John
This email and any files transmitted with it are confidential and intended
solely for the use of the individual or entity to whom they are addressed. If
you have received this email in error please notify the system manager. This
message contains confidential information and is intended only for the
individual named. If you are not the named addressee you should not
disseminate, distribute or copy this e-mail.