users@jersey.java.net

[Jersey] handling nulls

From: Florian Hehlen <Florian.Hehlen_at_imc.nl>
Date: Fri, 21 Jan 2011 08:20:48 +0000

Hi,

I have a problem with how nulls are being handled by jersey and jaxb. I have a number of end-points in my web-service that can return null if no result is found for the request. At the moment this results in some JAXB exception and then jersey converts it to an HTTP 500 status.

The only way I have found to handle this situation is to throw an EntityNotFoundException. This was ok, although not great, as long as I returned a HTTP 404 status. This started getting more complicated as recently we have wanted to make sure we can differentiate, from the client side, between functional and technical 404's.

So three options present themselves.

1. Add some kind of header tag to 404s that are the result of the application completing the call but finding nothing to return. This makes it possible to distinguish if nothing was found because server is down or if provided ID does not exist.

2. Return some other http status that we will know is to be mapped to entity not found.

3. Return something that is semantically correct. With collections I can return an empty list (<MyEntities/>) without problems so I should be able to return <MyEntity/>. It is valid XML and the Jersey client does convert that to a null.

Choice 1 is interesting but requires sophisticated error handling by the client for something that is not, after all, an error or an exception.

Choice 2 breaks REST and general web conventions by overloading the meaning of existing http status. The best type I have found in the list of specified types is 204 - NO CONTENT. But when I read about intended purpose it fails to represent my use-case.

Choice 3 is ideal because it fits my API requirements and seems elegant and semantically correct. But the only way I have found to implement it is a bit strange. It relies on using exception handling.

I do the following:

* Implemented NotFoundException and ExceptionMapper approach as stated in section 2.8 of the user guide(http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e418)

* Rather than return a 404 exception I return a 200 status with an empty tag <MyEntity>

I have a few issues with this approach:

* In my view exception handling should not be used for implementing functionality.

* It doesn't scale very well

o I have to add code for each entity type I want to handle

o I have not figured out how I could create a response based on the wanted mime-type(xml, json, fastinfoset,etc)

* I could write my own message body writers but then I would lose that perfectly fine support I am getting from JAXB.

Is there something I am missing? Is there a better way to address this issue?


Cheers,
Florian

________________________________

The information in this e-mail is intended only for the person or entity to which it is addressed.

It may contain confidential and /or privileged material. If someone other than the intended recipient should receive this e-mail, he / she shall not be entitled to read, disseminate, disclose or duplicate it.

If you receive this e-mail unintentionally, please inform us immediately by "reply" and then delete it from your system. Although this information has been compiled with great care, neither IMC Financial Markets & Asset Management nor any of its related entities shall accept any responsibility for any errors, omissions or other inaccuracies in this information or for the consequences thereof, nor shall it be bound in any way by the contents of this e-mail or its attachments. In the event of incomplete or incorrect transmission, please return the e-mail to the sender and permanently delete this message and any attachments.

Messages and attachments are scanned for all known viruses. Always scan attachments before opening them.