Reputation:
I am creating a page for adding phones to a user.
the xhtml page:
<h:form id="form1">
<p:growl id="messages" showDetail="true"/>
<p:panel header="Phone" style="width: 400px;">
<p:panelGrid columns="2">
<h:outputLabel for="number" value="Number: " />
<p:inputText id="number" value="#{addUserBean.phone.number}"/>
<h:outputLabel for="name" value="Country: " />
<p:inputText id="name" value="#{addUserBean.phone.country.name}"/>
<f:facet name="footer">
<h:commandButton value="Add Phone" action="#{addUserBean.Add}"/>
</f:facet>
</p:panelGrid>
<p:spacer height="30px;"/>
<p:dataTable value="#{AddUserBean.user.phones}" var="phonex" editable="true">
<f:facet name="header">
Phone List
</f:facet>
<p:ajax event="rowEdit" listener="#{AddUserBean.onEdit}" update=":form1:messages" />
<p:ajax event="rowEditCancel" listener="#{AddUserBean.onCancel}" update=":form1:messages" />
<p:column>
<f:facet name="header">
<h:outputText value="Number" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{phonex.number}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{phonex.number}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Country:" />
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{phonex.country.name}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{phonex.country.name}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Options" style="width:50px">
<p:rowEditor />
</p:column>
</p:dataTable>
</p:panel>
</h:form>
the backing bean :
@Named
@RequestScoped
public class AddUserBean {
private Phone phone;
private Country country;
private User user;
@Inject
UserBeanLocal userBean;
public AddUserBean(){
phone= new Phone();
phone.setCountry(new Country());
user= new User();
user.setPhones(new ArrayList<Phone>());
country= new Country();
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
public void Add(){
phone.getCountry().setName(country.getName());
user.getPhones().add(phone);
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
When i click the submit button it is supposed to add the new phone for the user in its list and refresh the datatable. My issue is that when it submits the user variable is not updated(it is updated but on the refresh it clears the variable) , this may be caused because of the constructor but if i delete the initialization a Null pointer exception raise.
saw this post but didn't work.
tried changing the bean property to SessionScoped(javax.enterprise.context.SessionScoped)
but this exception raises org.jboss.weld.exceptions.DeploymentException: WELD-000072: Bean declaring a passivating scope must be passivation capable. Bean: Managed Bean [class com.totempool.admin.beans.AddUserBean] with qualifiers [@Default @Any @Named]
Upvotes: 0
Views: 2056
Reputation: 120
if you must update an inputText, you must use in the component
<p:inputText .. widgetVar="myInput" />
and after that, you write in you command button,
<p:commandButton ... process="@widgetVar(myInput)" />
if you want to apply the update to all your components in your panel, you use "widgetVar" attribute for the panel".
good luck
Upvotes: 1