我正在使用jsf + primefaces 3.5。我的按钮不是在我的托管bean中调用一个方法。
我有这个xhtml:
<h:form>
<p:inputText id="name" value="#{userMB.userSelected.name}" />
<p:commandButton id="btnSave" value="Salvar" actionListener="#{userMB.save}"/>
</h:form>
我的托管bean是:
@ManagedBean
@SessionScoped
public class UsuarioMB implements Serializable{
User userSelected;
public void save(){
System.out.println(userSelected.getName());
//call my daos and persist in database
}
}
最奇怪的是,如果我删除了,该方法被调用!
如果我在p:commandButton“imediate = true”中放置一个属性,则调用该方法,但是,信息(userSelected.name)为空!
非常感谢:)
答案 0 :(得分:1)
它失败了,因为它投了NullPointerException
因为你从未初始化userSelected
。
将此添加到您的bean:
@PostConstruct
public void init() {
userSelected = new User();
}
如果您已经注意了服务器日志,那么您应该已经看过了。至于在webbrowser中完全没有关于异常的反馈,而在正常的同步(非ajax)中,你会看到一个HTTP 500错误页面,这是因为你发送的ajax请求显然没有ExceptionHandler
配置。
当您在按钮上设置immediate="true"
时,它的工作原理只是因为它会绕过所有未设置immediate="true"
的输入组件的处理。
答案 1 :(得分:0)
您尚未为managedbean UsuarioMB
指定名称。作为suche,它将被命名为usuarioMB
。
@ManagedBean - 将此bean标记为具有名称的托管bean 在name属性中指定。如果@ManagedBean中的name属性是 未指定,则托管bean名称将默认为类名 完全限定类名的一部分。
在此博客中详细了解它:http://mkblog.exadel.com/2009/08/learning-jsf2-managed-beans/
其次,如果您的上述代码已完成,则您缺少userSelected
的公共getter和setter。
第三,由于您已声明无参数动作侦测器,因此缺少ActionEvent
,请参阅Differences between action and actionListener
为了让您的代码正常工作,您需要将xhtml更改为
<h:form>
<p:inputText id="name" value="#{usuarioMB.userSelected.name}" />
<p:commandButton id="btnSave" value="Salvar" actionListener="#{usuarioMB.save}"/>
</h:form>
您的托管bean如下
import javax.faces.event.ActionEvent;
// ...
@ManagedBean
@SessionScoped
public class UsuarioMB implements Serializable{
private User userSelected;
public void save(ActionEvent event){
System.out.println(userSelected.getName());
}
public User getUserSelected() {
return userSelected;
}
public void setUserSelected(User userSelected) {
this.userSelected = userSelected;
}
}