我有一个素数selectOneMenu,其中包含使用转换器的对象列表,以便我可以返回整个Object。
加载具有selectOneMenu的View时,将在PermissionConverter中调用构造函数(因为转换器是一个bean),获取所有潜在的权限,然后调用getAsString来呈现selectOneMenu中的选项。初始化完成且100%。
这里的问题是我提交表单的时间。
当我在调用actionListener之后开始调试时,可以看到actionListener被立即调用并且userPermission对象为null。我继续浏览,发现在ActionListener之后,getAsObject被称为,获取了对象(看来),但什么也没有发生。 (引发错误是因为actionListener首先进入并且具有空对象。
可悲的是,我没有来自Spring的大量调试消息列表。没有CDI错误,什么也没有。
查看
<p:selectOneMenu id="uField"
converter="#{permissionConverter}"
disabled="true"
value="#{myController.newUser.userPermission}">
<f:selectItems value="#{myController.allAvailablePermissions}"
var="perm"
itemValue="#{perm}"
itemLabel="#{perm.permissionName}"/>
</p:selectOneMenu>
转换器:
@FacesConverter("permissionConverter")
@ManagedBean(name = "permissionConverter")
@ViewScoped
public class PermissionConverter implements Converter {
private PermissionServices permissionsServices = null;
private List<Permission> allPermissions = null;
public PermissionConverter() {
permissionsServices = new PermissionServices();
try {
allPermissions = permissionsServices.getAllPermissions();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String id) throws ConverterException {
if (StringUtils.isEmpty(id)) {
return null;
}
Permission permission = null;
try {
permission = allPermissions.stream().filter(e -> e.getPermissionId().equals(Integer.parseInt(id))).findFirst().orElse(null);
}
catch(Exception ex) {
ex.printStackTrace();
}
return permission;
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object obj) throws ConverterException {
if (obj instanceof Permission)
{
return String.valueOf(((Permission)obj).getPermissionId());
}
return null;
}
}
AppUserPermission
public class AppUserPermission {
private Integer permissionId;
private String permissionName;
public AppUserPermission() {
}
public Integer getPermissionId() {
return permissionId;
}
public void setPermissionId(Integer permissionId) {
this.permissionId = permissionId;
}
public String getPermissionName() {
return permissionName;
}
public void setPermissionName(String permissionName) {
this.permissionName = permissionName;
}
@Override
public boolean equals(Object o) {
// If object is itself, return true
if (o == this) {
return true;
}
// If object isn't AppUserPermission, return false
if (!(o instanceof AppUserPermission)) {
return false;
}
// Convert object to AppUserPermission
AppUserPermission appUser = (AppUserPermission) o;
// Compare the IDs
return Integer.compare(permissionId, appUser.getPermissionId()) == 0;
}
}