Robert, can you write up a WIKI page on how you did it on
http://wiki.apache.org/myfaces I think this might be interesting for other users as well. regards, Martin On 11/10/05, Robert Parsons <[EMAIL PROTECTED]> wrote: > Hi, > > I was actually checking to ensure that the ActionListener was not already > wrapped, but your method worked much better. Thankyou! > > -Robert > > > > Mathias Brökelmann wrote: > Sorry I forgot that a FacesContext instance is only available if a jsf > request is actually processed. > > But you have still access in the context listener to the configured > jsf application instance. I really suggest you to use something which > allows you to initialize a custom action listener only one time. If > you do it in a session listener you will end up with a new > actionlistener impl everytime a session starts. > > To get an instance of the JSF Application class use the FactoryFinder class: > > ApplicationFactory appFactory = > (ApplicationFactory)FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY) > Application app = appFactory.getApplication(); > > this is the way how we do it if we must wrap some core functionality > in jsf and still being implementation independent. > > 2005/11/10, Tim Davies <[EMAIL PROTECTED]>: > > > Im using the latest release of MyFaces. > > Im not really sure what to advise. I had it working okay with this > approach but I dont have the code anymore unfortuately so cant check back. > > Not much more I can suggest really, sorry. > > Robert Parsons wrote: > > > > Hi, > > I tried doing what you suggested and obtaining the existing > ActionListener on construction of mine, but: > > FacesContext.getCurrentInstance(); > > is returning null, so I cant access access the faces application. Are > you using MyFaces or the RI? > > Thanks, > -Robert. > > Tim Davies wrote: > > > > Seems a reasonable question but this does not seem to be the case. If > you initialise your reference to the original ApplicationListener in > your constructor then I think you should be fine. > > I would give it a go and see. This was working fine for me but I > admit I didnt look too deeply under the covers. > > > Robert Parsons wrote: > > > > Yes, > But if you do it in the faces-config how do you wrap the default > action listener? Wouldnt your action listener replace the default > one before you get a chance to wrap it? > > Thanks, > -Robert > > > Tim Davies wrote: > > > > Sorry that was a bit vague. > > Mathias suggested initialising the custom ApplicationListener in a > ServletContextListener object. However if this is registered as a > listener in web.xml then its contextInitialized() method will be > called before the FacesContext is initilised and so it will not work. > > I think that faces.config is probably the best place to set this as > then you know that it will always be set when faces is used and do > not have to worry about maintaining it in your own code somewhere. > > > Robert Parsons wrote: > > > > Thanks for the quick reply. > > I thought you said that at context initialisation the FacesContext > was not initialised? I have not tried it myself however. I decided > to wrap the handler when the first session is created instead. Is > there a better place to create the wrapper? > > Thanks, > -Robert. > > Tim Davies wrote: > > > > Mathias wrote a version that will do this earlier in this thread. > > Basically you need to get and store a reference to the original > actionlistener in your actionlistener. Then in your processaction > method you perform your work or set up your try catch block and > then call processAction on the original actionlistener. > > > > Robert Parsons wrote: > > > > I'm a little confused. If I register it in the faces-config.xml, > how do I then pass on the action to the existing action > listener? (the one that actually does something) Or is that not > how it works. I can only find information on action listeners > for components, not global ones like this. > > Tim Davies wrote: > > > > Just as an update to this, if you want to register your own > ActionListener then you can do so by adding the following > element to your faces-config.xml file. > > <application> > <action-listener> > com.example.MyActionListener > </action-listener> > </application> > > I tried it in the context listener but the FacesContext will > not have been initialised at the point when it is run. > > Thanks for the tips on this though. Has proved interesting. > > Tim > > > > Mathias Brökelmann wrote: > > > > the actionlistener which is accessed/registered through > Application is > responsible for handling actions. > > 2005/11/6, Mike Kienenberger <[EMAIL PROTECTED]>: > > > > > That's good to know. Does it work for action as well as > actionListener? > > On 11/6/05, Mathias Brökelmann <[EMAIL PROTECTED]> > wrote: > > > > > It´s quite easy to change the handling for invoking action > methods. > Simply wrap existing ActionListener Implementation of > processAction > with an try and catch block: > > FacesContext context = FacesContext.getInstance(); > final ActionListener actionListener = > context.getApplication().getActionListener(); > ActionListener wrappedActionListener = new ActionListener() > { > public void processAction(ActionEvent actionEvent) throws > AbortProcessingException > { > try > { > actionListener.processAction(actionEvent); > } > catch(Throwable t) > { > // do generic action exception handling here > } > } > } > context.getApplication().setActionListener(wrappedActionListener); > > > You can implement it in a > javax.servlet.ServletContextListener.contextInitialized() > method. and > register the listener in your web.xml file. > > 2005/11/5, Mike Kienenberger <[EMAIL PROTECTED]>: > > > > > It doesn't appear that there's an easy way to do this. > The events are triggered from UIComponentBase.broadcast() > which calls > each event.processListener() method which calls > ActionListener.processAction() which calls > methodBinding.invoke(). > > Ideally, you'd want to specify a custom > methodBinding.invoke() that > wrapped the error for you. Facelets does things > differently -- maybe > there's a way to create alternate MethodBinding rules for > ActionSources which create your subclass of MethodBinding > rather than > the default MethodBinding instances. You could try asking > about that > on the facelets mailing list. > > Another possiblity is to use aspect-oriented-programming > (AOP) to > intercept methodBinding.invoke(). However, I don't use > AOP, so I > can't tell you anything beyond that it appears to do what > you need. > > On 11/5/05, Robert Parsons <[EMAIL PROTECTED]> wrote: > > > > > Hi, > > thanks for the reply. the wording of my question was a > little bit off. I > was looking for an automatic way for Exceptions that were > thrown in any > action method to automatically be added as a message > (instead of the > horrible error screens i get from facelets at the moment). > > The only other option other than an automatic method would > be to wrap a > try-catch around all the code of every action I have and > generate a message > when an exception is caught. Sounds like that might have > to be the way I do > it. > > Thanks anyway, > -Robert. > > > Volker Weber wrote: > Hi, > > you can add a Message to FacesContect. > > See: > http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/javax/faces/context/FacesContext.html#addMessage(java.lang.String,%20javax.faces.application.FacesMessage) > > > regards > Volker > > Robert Parsons wrote: > > > Hi, > > Is there an easy way to make exceptions thrown by action > methods (on > backing beans) to generate messages? Or would this only be > possible by > modifying the MyFaces code. > > Thanks heaps, > -Robert > > > > > > > > > > > > > > > -- > Mathias > > > > > > > > > > > -- > Mathias > > > > -- > Tim Davies > Analyst Developer > > KTS PLC: Service you can bank on > 8th Floor, Finsbury Tower, > 103-105 Bunhill Row, > London EC1Y 8TY > tel: +44 (0)20 7256 2300 > fax: +44 (0)20 7256 2301 > > email: [EMAIL PROTECTED] > web: http://www.ktsplc.com > > > > > -- > Mathias > > > > > -- http://www.irian.at Your JSF powerhouse - JSF Consulting, Development and Courses in English and German Professional Support for Apache MyFaces

