apache myfaces codipeople.apache.org/~struberg/jax2011/codi_jax_2011.pdf · • codi reasons and...
TRANSCRIPT
![Page 1: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/1.jpg)
Apache MyFaces CODI
Mark Struberg,
INSO TU-Vienna
![Page 2: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/2.jpg)
About Myself
• [email protected]• [email protected]
• http://github.com/struberg• freelancer, programmer since 20 years• elected Apache Software Foundation member• Apache OpenWebBeans PMC + PMC and
committer in other ASF projects: MyFaces, BVAL, OpenJPA, maven, ...
• CDI EG member
![Page 3: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/3.jpg)
Agenda
• CODI Reasons and History• JSR-299 – writing a portable Extension
• CODI Core highlights• CODI Scopes• JSF-Support-Features• Typesafe Navigation• Database Utils• Compatibility with Seam3 and others
![Page 4: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/4.jpg)
What is CODI
• MyFaces CODI is an ASF project• http://myfaces.apache.org/extensions/cdi/index.html
• Wiki: https://cwiki.apache.org/confluence/display/EXTCDI
• use our mailing listsmailto://[email protected]://[email protected]
• download via maven or as distribution
• Bug Tracker: https://issues.apache.org/jira/browse/EXTCDI• Source:
svn co https://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk
![Page 5: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/5.jpg)
CODI History
• CODI started as collection of CDI utils• @ViewScoped
• Shortcomings of CDI @ConversationScoped• Contexts based on ideas of
Apache MyFaces Orchestra got added• typesafe navigation for JSF• Validation and Message modules• Focus on TypeSafety!
![Page 6: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/6.jpg)
CODI Modules
• CODI Core• CODI JSF-Module
• CODI Message-Module• CODI JPA-Module• CODI Bean-Validation• CODI Scripting-Module• Integration and Unit Test Module
![Page 7: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/7.jpg)
CODI Core
• Covers all CODI tools which only needs Java SE (no Java EE dependencies!)
![Page 8: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/8.jpg)
Writing a JSR-299 Extension
• CDI Extensions run on every EE6 container• Easy to write!
• Are activated by simply dropping them into the classpath
• CDI Extensions are based on java.util.ServiceLoader Mechanism
• Communicate with the Container via System events (spec section 11.5. Container lifecycle events)
![Page 9: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/9.jpg)
CODI ProjectStage
• determines the server status our project runs• possible values: UnitTest, Development,
SystemTest, IntegrationTest, Staging, Production
• Write your own one if needed!• A Producer Method exists• Usage:
private @Inject ProjectStage ps;if (ps == ProjectStage.Production) {..
![Page 10: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/10.jpg)
@ProjectStageActivated
• Sample Code from a CODI Extension• Allows to enable Beans depending on
ProjectStages• Defining the annotation is easy:
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})public @interface ProjectStageActivated { Class<? extends ProjectStage>[] value();}
![Page 11: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/11.jpg)
@ProjectStageActivated
• As is the Extension implementationpublic class ProjectStageActivationExtension implements Extension {
protected void vetoAlternativeTypes( @Observes ProcessAnnotatedType pat) { if(hasProjectStageActivatedAnnotation(pat)){ if (isInProjectStage(activatedIn)) { return; } // otherwise alternative shall not get used pat.veto(); }
![Page 12: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/12.jpg)
@ProjectStageActivated
• Extensions need to get registered in the ServiceLoader
• Create a file META-INF/services/javax.enterprise.inject.spi.Extension
• Write your Extensions classname into itorg.apache...ProjectStageActivationExtension
![Page 13: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/13.jpg)
@ProjectStageActivated
• Usage:@ApplicationScoped@Alternative@ProjectStageActivated(ProjectStage.UnitTest.class)public class MockSecurityService implements SecurityService {...
@ApplicationScoped@Alternative@ProjectStageActivated( {UnitTest.class, Development.class})public class MockMailService implements MailService {
![Page 14: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/14.jpg)
Let's do some hacking
• Create a new project from a maven archetype$> mvn archetype:generate -DarchetypeCatalog=\http://people.apache.org/~jakobk/m2_archetypes_103_release
• Select 'myfaces-archetype-codi-jsf20'
• start the web application in jetty$> mvn clean install -PjettyConfig jetty:run-exploded
$> tree src
![Page 15: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/15.jpg)
CODI Logger
• Serializable Version of java.util.logging.Logger
• Beause jul.Logger is not Serializable and therefor cannot be injected into passivating scoped beans!
![Page 16: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/16.jpg)
ClassDeactivator
• All Extensions are enabled by default• Single Extensions can be 'disabled' via the
ClassDeactivator mechanism• Useful if single Extensions clash with
Extensions from other libraries (e.g. Seam3)
![Page 17: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/17.jpg)
CODI Scopes
• CODI provides new scopes for CDI
![Page 18: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/18.jpg)
CDI Standard Scopes
• package javax.enterprise.context• @RequestScoped
• @SessionScoped• CDI @ConversationScoped• @ApplicationScoped• (@Dependent)
![Page 19: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/19.jpg)
New CODI Scopes
• @WindowScoped• CODI @ConversationScoped
• Grouped Conversations• @ViewScoped• @ViewAccessScoped• JSF Scope Converter Extension
![Page 20: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/20.jpg)
@WindowScoped
• Basically a Session for a window Tab• Still no native browser support for window
handling.• multiple strategies for handling the 'windowId'
– windowId action URL parameter – window.name on intermediate page– lazy context dropping
![Page 21: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/21.jpg)
@WindowScoped sample
@WindowScopedpublic class SearchListBean implements Serializable { //... }
![Page 22: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/22.jpg)
windowId drop script
• META-INF/resources/js/windowId.jsfunction assertWindowId() { var freshWindow = window.name.length < 1; if (freshWindow) { url = urlWithoutWindowId(window.location.href); window.name = "window"; window.location = url; }}
• layout facelet template: <h:outputScript name="windowId.js" library="js"/> <script type="text/javascript"> assertWindowId() </script>
![Page 23: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/23.jpg)
CODI @ConversationScoped
• Shortcomings of the builtin CDI Conversation– starts lazily – transient by default
-> cannot open conversation early enough– no window separation– no parallel access allowed
-> problems with AJAX– only one Conversation at a time– ...
![Page 24: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/24.jpg)
CODI @ConversationScoped
• roughly based on MyFaces Orchestra concepts
• bound to a single bean by default• eagerly created• can be immediately terminated manually• can be restarted manually
![Page 25: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/25.jpg)
CODI @ConversationScoped
• Example@ConversationScopedpublic class EditCarWizardBean implements Serializable { private @Inject Conversation conv;
public String saveCar() { // savethecar...
conv.close(); return null; } public String resetDialogue() { // conv.restart(); return null; }}
![Page 26: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/26.jpg)
Grouped Conversations
• Grouping beans which belong to the same conversation
• @ConversationGroup as marker Qualifier with a binding value!
• Terminating a whole group possible
![Page 27: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/27.jpg)
Using ConversationGroups
• Defining the marker interfaceinterface CarEditConversationGroup {}
• Using it on various backing beans@Named@ConversationScoped@ConversationGroup(CarEditConversationGroup.class)public class ConversationDemoBean1 implements Serializable {
![Page 28: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/28.jpg)
Using 1 Bean for n Conversations
• Create ConversationGroups via Producers@Produces@ConversationScoped@ConversationGroup(UseCase1.class)public DemoBean createDemoBeanForUseCase1() { return new DemoBean("createDemoBeanForUseCase1");}
@Produces@ConversationScoped@ConversationGroup(UseCase2.class)public DemoBean createDemoBeanForUseCase2() { return new DemoBean("createDemoBeanForUseCase2");}
![Page 29: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/29.jpg)
@ViewScoped
• CDI Context making the JSF ViewMap available for @Inject
• uses the standard JSF [email protected]
• Not an own storage but only a CDI access to the JSF ViewMap
• get's cleaned up whenver a customer leaves the view.
![Page 30: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/30.jpg)
@ViewAccessScoped
• Has nothing to do with @ViewScoped• kind of 'automatic Conversation'
• will be closed if the bean isn't accessed on a view anymore
![Page 31: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/31.jpg)
Converting JSF Scopes to CDI
• A classical JSF managed bean@[email protected] class MyNiceLittleBunnyBackingBean {..
• MappedJsf2ScopeExtension active by default • only JSF beans without @ManagedBeans• very useful if IDEs import the wrong package• Attention:
– default scope JSF: @RequestScoped– default scope CDI: @Dependent
![Page 32: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/32.jpg)
@JsfPhaseListener
@ProjectStageActivated(Development.class)@Advanced @JsfPhaseListenerpublic class DebugPhaseListener implements PhaseListener { @Inject private Logger logger; public void beforePhase(PhaseEvent pe) { this.logger.info("before " + pe.getPhaseId()); } public void afterPhase(PhaseEvent pe) { this.logger.info("after " + pe.getPhaseId()); } public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE; }}
![Page 33: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/33.jpg)
@InvocationOrder
• Used to order various CODI helpers• default order = 1000
@JsfPhaseListener@InvocationOrder(10)public class DebugPhaseListener implements PhaseListener { //...}
![Page 34: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/34.jpg)
JSF Lifecycle Observers
• Annotations– @BeforePhase
– @AfterPhase• Example
public void preInvokeApplication( @Observes @BeforePhase(ANY_PHASE) PhaseEvent event) { //...}
![Page 35: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/35.jpg)
TypeSafe JSF Navigation
• JSF-2 navigation is based on strings
– hard to refactor– error prone
• CODI provides a type safe approach– Create your ViewConfig as class– Create your page structure as classes– hold your view definition in exactly 1 place– @Secured for pages, etc
![Page 36: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/36.jpg)
A simple ViewConfig
• If no name given, the classname matches the JSF page (without .xhtml)@Pagepublic final class Home implements ViewConfig {}
• Or name your page explicitely and set modes@Page(name="puh", navigation=NavigationMode.REDIRECT, viewParams=ViewParameterMode.INCLUDE)public final class Home implements ViewConfig {}
![Page 37: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/37.jpg)
A simple Wizzard
• Convenient behaviour for corresponding pages:@Page(navigation = REDIRECT)public abstract class Wizard implements ViewConfig{ @Page public final class Step1 extends Wizard { } @Page public final class Step2 extends Wizard { }}
• Leads to /wizzard/step1.xhtml and /wizzard/step2.xhtml
![Page 38: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/38.jpg)
Usage in the backing bean
• Use the ViewConfig class for your navigation casepublic Class<? extends ViewConfig> showNext() { return Page2.class;}
![Page 39: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/39.jpg)
Persistence without EJB
• EJBs are transaction aware by default• CDI beans don't have any default behaviour
(besides the proxying)• CODI provides a @Transactional annotation
plus TransactionalInterceptor• supports nested transactions• even across multiple Databases
![Page 40: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/40.jpg)
Create your EntityManager
• The ONLY working pattern is entitymanager-per-request
• All others (putting EntityManager in to the Session) is NOT working in clusters.
![Page 41: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/41.jpg)
Produce your EntityManager
@RequestScopedpublic class EntityManagerProducer { private @PersistenceContext(unitName="Course") EntityManager entityManager; @Produces @RequestScoped @QCourse public EntityManager createEntityManager() { return entityManager; } public void dispose(@Disposes @QCourse EntityManager entityManager) { entityManager.close(); } }
![Page 42: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/42.jpg)
@Transactional Service
@Transactional(qualifier=@QCourse)public class MyUserService { private @Inject @QCourse EntityManager em;
public User getUser(long id) { return em.find(id, User.class); }}
![Page 43: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/43.jpg)
CODI Messages
• Easily create internationalized Messages• Support for creating FacesMessages
@Inject @Jsfprivate MessageContext messageContext;
messageContext.message() .text("{msgUserRegistered}") .namedArgument("userName", user.getUserName()) .create();messageContext.message() .text("{msgLoginFailed}") .payload(ERROR) .add();
![Page 44: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/44.jpg)
Documentation
• JSR-299 spec: http://jcp.org/en/jsr/detail?id=299http://jcp.org/en/jsr/detail?id=346
• OpenWebBeans:http://openwebbeans.apache.orgsvn co http://svn.apache.org/repos/asf/openwebbeans/trunk
• CODIhttps://cwiki.apache.org/confluence/display/EXTCDIsvn co http://svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk
![Page 45: Apache MyFaces CODIpeople.apache.org/~struberg/jax2011/CODI_JAX_2011.pdf · • CODI Reasons and History • JSR-299 – writing a portable Extension • CODI Core highlights •](https://reader033.vdocuments.us/reader033/viewer/2022042219/5ec57da38e4736552316e678/html5/thumbnails/45.jpg)
Legal stuff
• Apache, OpenWebBeans, MyFaces, CODI, OpenEJB and OpenJPA are trademarks of the Apache Software Foundation
• Seam3 and Weld are trademarks of JBoss inc• CanDI is a trademark of Caucho Inc