[JBoss JIRA] Created: (SEAMFACES-21) raise before navigate event
by Dan Allen (JIRA)
raise before navigate event
---------------------------
Key: SEAMFACES-21
URL: https://jira.jboss.org/browse/SEAMFACES-21
Project: Seam Faces
Issue Type: Feature Request
Components: JSF CDI Integration
Affects Versions: 3.0.0.Alpha2
Reporter: Dan Allen
Fix For: 3.0.0.Alpha3
One of the system event candidates that was overlooked in JSF 2.0 was a before navigation event, which would get fired just before the call to NavigationHandler#handleNavigation(). This is a very interesting transition and would open up a lot of possibilities for application developers, because JSF really don't accommodate this extension well. (Seam 2 had some functionality for setting context variables before navigation, but IMHO it would be far more powerful if we just raised an event so that the developer could execute any sort of logic before navigation).
Forget even making a JSF system event out of it. Let's just raise it using CDI events (since we are bridging the JSF events anyway).
I propose that we introduce the event qualifier:
@Qualifier
@Target( { FIELD, PARAMETER })
@Retention(RUNTIME)
public @interface FacesNavigation {
}
and the event object would be the NavigationCase.
public void preNavigate(@Observes @Before @FacesNavigation NavigationCase nc) {
nc.getParameters().put("foo", Arrays.asList("bar"));
}
This can be combined with @Before and @View for filtering the event. We may even want @ToView to filter both the current and target view. Not sure how fine-grained to get.
Here's a rough sketch of how this might be implemented. Unfortunately, this exposes the nastiness of the ConfigurableNavigationHandler in JSF 2.0, but at least we can leverage the NavigationCase resolution method we added for ourselves.
public class SeamNavigationHandler extends ConfigurableNavigationHandler {
private final NavigationHandler delegate;
public SeamNavigationHandler(NavigationHandler delegate)
{
this.delegate = delegate;
}
@Override
public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome)
{
if (delegate instanceof ConfigurableNavigationHandler) {
return ((ConfigurableNavigationHandler) delegate).getNavigationCase(context, fromAction, outcome);
}
// I guess
return null;
}
@Override
public Map<String, Set<NavigationCase>> getNavigationCases()
{
if (delegate instanceof ConfigurableNavigationHandler) {
return ((ConfigurableNavigationHandler) delegate).getNavigationCases();
}
// I guess
return null;
}
@Override
public void handleNavigation(FacesContext context, String fromAction, String outcome)
{
if (delegate instanceof ConfigurableNavigationHandler) {
// we need to perform the resolution before JSF gets it so that we know where we are headed
NavigationCase navigationCase = ((ConfigurableNavigationHandler) delegate).getNavigationCase(context, fromAction, outcome);
if (navigationCase != null) {
// this is solved elsewhere in Seam Faces, so just use that same hook
BeanManager beanManager = ...;
beanManager.fireEvent(navigationCase, new AnnotationLiteral<Before>() {}, new AnnotationLiteral<FacesNavigation>() {}, new ViewLiteral(context.getViewRoot().getViewId())));
}
}
delegate.handleNavigation(context, fromAction, outcome);
}
}
We could support short-circuiting the view handler by checking for context.getResponseComplete() (redirect occurred) or if the view root changed (render occurred), but that might be abusing this hook.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months
[JBoss JIRA] Created: (SEAMFACES-42) IllegalProductException: WELD-000052 Cannot return null from a non-dependent producer method
by Brian Leathem (JIRA)
IllegalProductException: WELD-000052 Cannot return null from a non-dependent producer method
--------------------------------------------------------------------------------------------
Key: SEAMFACES-42
URL: https://jira.jboss.org/browse/SEAMFACES-42
Project: Seam Faces
Issue Type: Bug
Components: Messages & i18n
Affects Versions: 3.0.0.Alpha3
Environment: Glassfish 3.0.1, Weld 1.0.1-FINAL, Seam3 Faces 1.0-ALPHA3
Reporter: Brian Leathem
I created a Custom Exception handler to trap "NonexistentConversationException" exceptions as per Ed Burns howto:
http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefull...
The exception handler attempts to redirect the faces navigation:
nav.handleNavigation(fc, null, "/workrequest/index.xhtml");
This results in the stack trace:
org.jboss.weld.exceptions.IllegalProductException: WELD-000052 Cannot return null from a non-dependent producer method: org.jboss.weld.bean.ProducerMethod$1@32ac538c
at org.jboss.weld.bean.AbstractProducerBean.checkReturnValue(AbstractProducerBean.java:255)
at org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:361)
at org.jboss.weld.context.AbstractMapContext.get(AbstractMapContext.java:112)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.getProxiedInstance(ClientProxyMethodHandler.java:143)
at org.jboss.weld.bean.proxy.ClientProxyMethodHandler.invoke(ClientProxyMethodHandler.java:100)
at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)
at org.jboss.seam.faces.context.FlashContext_$$_javassist_785.put(FlashContext_$$_javassist_785.java)
at org.jboss.seam.faces.status.MessagesAdapter.flushBeforeNavigate(MessagesAdapter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:304)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:54)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:163)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:298)
at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:200)
at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:59)
at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:194)
at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:241)
at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:216)
at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:654)
at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:647)
at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:641)
at org.jboss.seam.faces.event.PreNavigateEventProducer.handleNavigation(PreNavigateEventProducer.java:65)
at ca.triumf.mis.qms.workrequest.jsf.exception.NonexistentConversationExceptionHandler.handle(NonexistentConversationExceptionHandler.java:48)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
It seems as if the seam faces module is trying to put messages in the flash context, and this is causing a weld exception to be thrown. I hope I'm reading this as a Seam3 Faces error correctly :P
Thanks as always,
Brian
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months