JSF/CDI 依赖注入 ActionListener
JSF/CDI dependency injection into ActionListener
为什么 CDI 不在这个 ActionListener 中注入我的支持 bean(会话范围)? loginBean 实例始终为空。我的印象是 CDI 不管理侦听器实例:对吗?
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
public class CancelListener implements javax.faces.event.ActionListener {
private LoginBean loginBean;
@Inject
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
@Override
public void processAction( ActionEvent event ) throws AbortProcessingException {
loginBean.setLogin( "" );
loginBean.setPassword( "" );
}
}
这里是我的LoginBean的定义class.
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
@Named
@SessionScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = -5433850275008415405L;
private String login = "james@mi6.uk";
private String password = "007";
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
并且我的监听器使用以下代码连接到按钮:
<h:commandButton value="Cancel" immediate="true">
<f:actionListener type="mypackage.CancelListener" />
</h:commandButton>
我知道我可以直接在支持 bean 上使用方法(与 actionListener 标记属性连接),但我想了解如何使我的 class 与 CDI 兼容以及在这种情况下如何强制注入。提前致谢。
您还没有解释 为什么 您需要使用实现 ActionListener
接口的 bean,而不是使用方法限定符作为 actionListener
属性在 UIComponent 里面。
正如您似乎已经尝试过的那样,制作 CancelListener
CDI bean 不足以正确实例化它:LoginBean 将为空。
但是,使用 binding
属性将强制 JSF 动态实例化 bean,这将起到作用:
<h:commandButton value="Cancel" immediate="true">
<f:actionListener binding="#{cancelListener}" type="mypackage.CancelListener" />
</h:commandButton>
如上所述,实现 ActionListener
的 class 也必须是 CDI bean:
@Named
@SessionScoped
public class CancelListener implements Serializable, javax.faces.event.ActionListener {
@Inject
private LoginBean loginBean;
@Override
public void processAction(ActionEvent event) throws AbortProcessingException {
System.out.println(this.toString());
System.out.println(loginBean.toString());
}
}
另请参阅:
How does the 'binding' attribute work in JSF? When and how should it be used?
为什么 CDI 不在这个 ActionListener 中注入我的支持 bean(会话范围)? loginBean 实例始终为空。我的印象是 CDI 不管理侦听器实例:对吗?
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
public class CancelListener implements javax.faces.event.ActionListener {
private LoginBean loginBean;
@Inject
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
@Override
public void processAction( ActionEvent event ) throws AbortProcessingException {
loginBean.setLogin( "" );
loginBean.setPassword( "" );
}
}
这里是我的LoginBean的定义class.
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
@Named
@SessionScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = -5433850275008415405L;
private String login = "james@mi6.uk";
private String password = "007";
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
并且我的监听器使用以下代码连接到按钮:
<h:commandButton value="Cancel" immediate="true">
<f:actionListener type="mypackage.CancelListener" />
</h:commandButton>
我知道我可以直接在支持 bean 上使用方法(与 actionListener 标记属性连接),但我想了解如何使我的 class 与 CDI 兼容以及在这种情况下如何强制注入。提前致谢。
您还没有解释 为什么 您需要使用实现 ActionListener
接口的 bean,而不是使用方法限定符作为 actionListener
属性在 UIComponent 里面。
正如您似乎已经尝试过的那样,制作 CancelListener
CDI bean 不足以正确实例化它:LoginBean 将为空。
但是,使用 binding
属性将强制 JSF 动态实例化 bean,这将起到作用:
<h:commandButton value="Cancel" immediate="true">
<f:actionListener binding="#{cancelListener}" type="mypackage.CancelListener" />
</h:commandButton>
如上所述,实现 ActionListener
的 class 也必须是 CDI bean:
@Named
@SessionScoped
public class CancelListener implements Serializable, javax.faces.event.ActionListener {
@Inject
private LoginBean loginBean;
@Override
public void processAction(ActionEvent event) throws AbortProcessingException {
System.out.println(this.toString());
System.out.println(loginBean.toString());
}
}
另请参阅:
How does the 'binding' attribute work in JSF? When and how should it be used?