我这里有情况。我使用托管 bean 作为转换器从数据库中预填充 SelectManyCheckBox 并且效果很好。这是我的转换器类
@ManagedBean
@RequestScoped
public class RoleConverter implements Converter{
@EJB
private UserRoleSingleton userRoleSingleton;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value == null){
return null;
}
return userRoleSingleton.getUserRoleById(Integer.parseInt(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(!(value instanceof Userrole) || ((Userrole) value).getRoleId() == null){
return null;
}
Userrole role = (Userrole) value;
return String.valueOf(role.getRoleId());
}
public RoleConverter() {
}
}
在它预选复选框后,我选择或取消选择复选框或什么都不做,然后单击表单中的提交按钮。然后按钮的第一次单击只是再次执行转换器的 getAsString 方法并重新加载页面。在第二次单击时,它按预期执行 getAsObject 方法,然后执行操作。
这是我的 SelectManyCheckBox:
<p:selectManyCheckbox id="orgpermission"
value="#{adminView.selectedrolesorg}" layout="pageDirection">
<f:selectItems value="#{adminView.allRolesRelatedToOrgInfo}"
var="citrole" itemValue="#{citrole}"
itemLabel="#{citrole.roledescription}" converter="#{roleConverter}" />
</p:selectManyCheckbox>
为什么它再次执行 getAsString 方法以及如何解决它以在第一次单击时触发动作方法?