我觉得Java EE 6规范有点乱.有几组注释.
我们有javax.ejb类似于@Stateful和@Stateless创建EJB的注释.
还有一个@javax.annotation.ManagedBean用于创建托管bean.
javax.enterprise.context喜欢@SessionScoped和注释中有注释@RequestScoped.
更重要的是也有@ManagedBean和@SessionScoped/ @RequestScoped在注释javax.faces.bean包.
为了使事件更复杂,有一个javax.inject带@Named注释的包.
有人可以描述一下他们之间的关系吗?
我在哪里可以使用@EJB,@Inject或@ManagedPropery注入其他豆类?
我刚开始阅读Core JavaServer Faces,第3版.他们这样说(强调我的):
对于可以在JSF页面中使用的bean,有两种不同的机制,CDI bean和JSF托管bean,这是一个历史事故.我们建议您使用CDI bean,除非您的应用程序必须在像Tomcat这样的普通servlet运行器上运行.
为什么?他们没有提供任何理由.我一直在使用@ManagedBean在GlassFish 3上运行的原型应用程序中的所有bean,我还没有发现任何问题.我不介意迁移@ManagedBean到@Named,但我想知道为什么我应该打扰.
我正在尝试处理@ManagedProperty但没有成功!
我一直在关注这个指南,看起来并不难.但我的代码根本行不通!
这是一个小片段
@ManagedBean
@SessionScoped
public class LoginBean {
@EJB
private LoginUserLocal loginUser;
private boolean loggedIn = false;
private User user;
private StreamedContent image;
.
.
.
//--
@Named(value = "messagesBean")
@RequestScoped
public class MessagesBean {
@ManagedProperty(value = "#{loginBean}")
private LoginBean loginBean;
public LoginBean getLoginBean() {
return loginBean;
}
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
public String getUser() {
System.err.println(loginBean == null);
return loginBean.getUser().getUsername();
}
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个NullPointerException,说loginBean为null!
有什么建议吗?
我有: - 存储库类:
@SessionScoped
public class EmployeeRepository {
@PersistenceContext
EntityManager entityManager;
public List<Employee> getEmployees(){
TypedQuery<Employee> qu = entityManager.createQuery("select * from Employee", Employee.class);
List<Employee> emp2 = qu.getResultList();
return emp2;
}
}
Run Code Online (Sandbox Code Playgroud)
和
托管 Bean:
@ManagedBean(name = "helloWorldBean")
public class HelloWorldBean {
@Inject
private EmployeeRepository employeerepo;
public String getMsg() {
return "Hallo";
}
public String getEmployees() {
return String.valueOf(employeerepo.getEmployees().size());
}
}
Run Code Online (Sandbox Code Playgroud)
和一个 JSF 页面:
<h:head>
<title>JavaCodeGeeks</title>
</h:head>
<h:body>
- Message : <h:outputText value="#{helloWorldBean.msg}" />
- Employee count : <h:outputText value="#{helloWorldBean.employees}" />
</h:body> …Run Code Online (Sandbox Code Playgroud) cdi ×4
jsf ×3
java-ee ×2
ejb ×1
inject ×1
java ×1
java-ee-6 ×1
jboss-weld ×1
jsf-2 ×1
managed-bean ×1