Why is Java EE 6 CDI missing the @ViewScoped and @FlashScoped annotations? (especially the former makes me wonder, because CDI stems from the Seam world, which already knew the very similar ScopeType.PAGE...)
What are the recommended workarounds when using CDI? Use Seam 3?
Thanks
The @ViewScoped
is specific to the MVC framework JSF, not to the dependency injection framework CDI. The view scope lives as long as you're interacting with the same JSF view. CDI has not really a notion of "views". The CDI alternative to that is @ConversationScoped
which lives longer than the request scope, but shorter than the session scope. You only have to control the termination yourself. You can if necessary use MyFaces CODI to bridge the JSF @ViewScoped
to CDI @Named
beans. The upcoming JSF 2.2 will have a CDI compatible @ViewScoped
in the javax.faces.view
package.
The @FlashScoped
doesn't exist in JSF. The JSF flash scope exist of basically a map which is backed by a short-living cookie which survives HTTP redirects. You cannot let JSF put managed beans in this scope. You've to manually put/get the values in/from the map yourself and/or use the #{flash}
reference in EL which basically refrences the map. Seam Faces has however hijacked the JSF specific javax.faces.bean
package for its @FlashScoped
annotation, but this is definitely not from standard JSF API.
See also:
- Add items to List in Request Scoped Bean - contains some concrete examples of CDI alternatives
You can implement the context and use the @NormalScope to create your own CDI Scope witout using any other framework or waiting for the new JEE7
- CDI fires an event AfterBeanDiscovery after each bean call
- You can use CDI extension to @Observes this event and add your context implementation
- In your scope implementation you can :
- Use Contextual to get your bean by its name from FacesContext ViewRoot Map and return it after each ajax call back
- Use CreationalContext if the bean name from first step is not found to create it in the FacesContext ViewRoot Map
for a more in-depth explanation i recommand this link : http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/