@Stateful @Model public class MemberRegistration { @Inject private EntityManager em; @Inject private Event<Member> memberEventSrc; private Member newMember; @Produces @Named public Member getNewMember() { return newMember; } }
然后…我看到一个jsf页面引用了这个newMember对象,如下所示:
<h:inputText value=#{newMember.name}/>
所以我的问题是:如果我在任何对象的变量中放置一个@Named注释,那么JSF代码是否可以访问?
此外,在这种情况下,@Produces的用法是什么,最后在Java EE 6中@Stateful优先于@Stateless?如果是这样的话呢?
解决方法
需要使用@Named(CDI)或@ManagedBean(JSF-native)注释来创建JSF已知的bean.然而,Java EE具有定型观念,它是一种组合许多其他注释的复合注释.
在这种情况下,@Model是这样一种刻板印象,它结合了@Named和@RequestScoped.
@Produces注释工厂方法;知道从哪里获取一些类型的实例的方法.它可以与所谓的限定符注释组合,例如@Foo,之后可以使用该注释来注入某些bean.然而,它与@Named结合使用,从而使newMember可用于JSF.而不是像例子那样创建bean.首先遇到一个@RequestScoped bean,当JSF想要一个实例时,将覆盖getNewMember()方法.有关更多信息,请参阅Dependency Injection in Java EE 6.
@Stateful通常不优于@Stateless,当独立使用时. @Stateless bean被合并,并为客户端(通常在事务上下文中)执行一个方法.他们的有状态对象不是汇集的,没有CDI,调用者必须跟踪其生命周期(最终调用@Remove注释方法).在这里,bean也被分配了一个范围(请求,通过@Model),所以容器会照顾这个.
在这里使用此注释的可能原因可能是使bean的方法事务性.虽然给定的片段没有显示其使用,我猜这个类的一个版本有更多的方法使用EntityManager.交易将在那里发挥作用.
(注意,以这种方式组合注释给Java EE开发人员提供了很多的权力,但是它在一个bean中提出了一些问题,这与一个bean应该做一件事情做得很好的说法相反,另一种是@Model注释仅关注视图问题的bean,它注入了封装业务逻辑而不是EntityManager的@Stateless bean.)