在actionListener之前未调用JSF转换器,导致空对象

时间:2018-09-20 17:05:30

标签: jsf

  • Java 8
  • Spring Boot
  • Spring Security

我有一个素数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;
    }
}

0 个答案:

没有答案