Session Scoped Managed bean在ajax请求中为null

时间:2012-03-12 09:01:49

标签: ajax jsf-2 primefaces managed-bean

我正在使用JSF 2和primefaces 2.1.3与tomcat。我试图以下列方式访问转换器类中的会话作用域托管bean。

MemberConverter{
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
                throws ConverterException {
    MemberBean memberBean = (MemberBean)((HttpSession)arg0.getExternalContext().getSession(true)).getAttribute("memberBean");
    }
}

该方法在ajax调用中由p:picklist调用,但问题是在ajax请求中memberbean为null。如果在简单的http请求期间调用,则memberbean不为null。如果在ajax请求中调用memberbean,我怎样才能确保memberbean不为null。

以下编辑

<p:dialog header="Member Contacts" widgetVar="dialog_memberContacts" resizable="false"  
                showEffect="bounce" hideEffect="explode" modal="true" position="center" appendToBody="true">
    <h:form id="form_compose_2">
            <h:panelGrid columns="1">
                <p:selectOneMenu id="dropdown_groups" value="#{groupBean.selectionGroup}" converter="groupConverter"
                    style="size:200px;">  
                    <f:selectItem itemLabel="Select Group" itemValue="#{null}" noSelectionOption="true" />
                    <f:selectItems value="#{groupBean.groups}" var="group" itemLabel="#{group.gname}" itemValue="#{group}"/>  
                    <p:ajax process=":form_compose_2:list_members" update=":form_compose_2" listener="#{groupBean.handleGroupChange}" />  
                </p:selectOneMenu>
                <p:pickList id="list_members" value="#{membershipBean.membersList}" var="member" 
                        iconOnly="true" itemLabel="#{member.fname} #{member.lname}" style="width:450px;"
                        itemValue="#{member}" converter="memberConverter">  
                    <f:facet name="sourceCaption">Available</f:facet>  
                    <f:facet name="targetCaption">Selected</f:facet>  
                </p:pickList>

            <p:commandButton value="Ok" action="#{groupBean.updateMemberState}" oncomplete="dialog_memberContacts.hide()"
                    update=":form_compose:input_group" style="float:right;"/>
            </h:panelGrid>
    </h:form>
    </p:dialog>

是否与对话框有关。此页面上有两种形式。你可以看到一个在对话框内。另一种形式是form_compose

1 个答案:

答案 0 :(得分:1)

我认为您应该使用HttpSessionConverter注释@MangagedBean并注入@RequestScope bean,而不是尝试从@SessionScoped获取它@ManagedProperty。它会是这样的:

@ManagedBean
@RequestScoped
public class MemberConverter extends Converter {
    @ManagedProperty(value="#{memberBean}")
    private MemberBean memberBean;

    ...
    // Getters and Setters
}