hi gary,
thanks for the thoughts. You're right, AOP would do it, but I also have a
dislike of AOP and would want to use it for this unless I was convinced it was
worth leveraging getLocalizedMessage().
I'm with you on the idea of putting the localization key into the exception, but
I'm not too keen on the idea of a LocalizedMessageResolverForExceptions in the
business model. I prefer the idea of providing the Locale and the ResourceBundle
via some static ThreadLocals - I guess they could sit on the app's base
Exception, and the front-end would initialize them via a filter or an
interceptor so that any exception thrown can see them.
Saying that though, is there any point? Why bend over backwards like that? I
searched the web for references to getLocalizedMessage() usage, and of course
found a hundred thousand online javadocs for every java app under the sun
quoting "inherited from Throwable", but none of the ones I looked at implemented
it.
Are there any frameworks out there that leverage getLocalizedMessage? For
instance EJBs, webservices, JSF, Swing, SWT?
Gary Affonso on 23/12/07 05:43, wrote:
A agree that you're going to have to bind something to the Exception in
order to do I18N resolution. And I agree that creating that binding sucks.
If you don't want to ditch getLocalizedMessage you could AOP it. Have
your getLocalizedMessage() method wrapped with some advice that swaps in
the localized version of the message. Spring makes that pretty easy,
and it makes it easy to bind dependencies to the advice.
At least I think Spring makes that easy, I've never applied advice to an
Exception. Spring's AOP is a bit watered down from something like
AspectJ, it may be if you want to do something like advise methods
within Exceptions you'll have to drag out the AOP big-guns.
But jeez, AOP? I try to use AOP pretty sparingly. While it can make
certain hard things really easy (stuff that clearly cross-cuts, and
cross-cuts a lot) it also can make code way, way more obscure.
You could also just return your custom exception classes with no
localized messages at all. And then have a class...
LocalizedMessageResolverForExceptions
... that knew how to accept each of your custom exceptions and map it to
a localized message. At least that way all the message-lookup
dependencies are in your Message resolver class.
That assumes, of course, that you're willing to create a fairly
fine-grained custom Exception hierarchy (one Exception per message so
that the MessageResolver knows what message to lookup).
The other way to go would be to create a fairly course-grained hierarchy
but embed within each instantiated Exception class some key that could
be used by your MessageResolver later down the road (in your action, in
your view, etc). So your Exceptions would implement something like...
String getMessageKey()
And then in your view or action you'd pass that key to your
LocalizedMessageResolver and it would return the localized message.
Going that way also makes your LocalizedMessageResolver Exception
non-specific, good if you want to lookup more than just
exception-related messages. Anything that could return a message key
would work with it.
The downside to the key-idea (as opposed to the fine-grained Exceptions)
is that you lose some type safety (you can indicate an incorrectly
spelled key and you wouldn't know it). Sure would be nice if all the
keys were static constants in the MessageResolver class but then you're
back to having a dependency in your Exceptions.
Obviously some give or takes but maybe that gives you some ideas. I'm
going to be tackling our own message service soon, this was helpful to
think through. Timely question (for me)! :-)
- Gary
Adam Hardy wrote:
I came across a conundrum while implementing the S2 exception handling
that we were discussing in another thread.
As the title suggests, I'm interested in
Exception.getLocalizedMessage() but have a seemingly intractable
problem with it.
Exception.getLocalizedMessage() returns by default the message in
getMessage() but is put there by Sun and the Java creators as a useful
method that we coders can override in our Exception child classes with
our own method that localizes the exception message.
The problem is, my exceptions mostly live in my business model module.
However, to localize the exception message, the exception needs access
to a Resource bundle which are all front-end artifacts that I don't
want in my business model module.
Also I don't want a dependency from my business model onto the front-end.
And of course, I can't pass in parameters when calling
getLocalizedMessage().
So what's the score here? Is getLocalizedMessage() dead in the water,
or is there another way that's not overcomplicated?
Is there anybody actually implementing getLocalizedMessage() on their
exceptions?
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]