Каскадное значение модели p: selectOneMenu не задано

У меня есть приложение, в котором есть каскадное раскрывающееся меню, простое раскрывающееся меню и кнопка отправки. Я хочу показать отчет в таблице данных, выбрав различные критерии из раскрывающихся списков. все работает нормально, за исключением случаев, когда я хочу выбрать критерии из раскрывающегося списка дочерних элементов. он не связывается со своим значением в управляемом компоненте (обнаружил это путем отладки). вот мой код: xhtml:

<h:outputText value="Exchange"/>
            <p:selectOneMenu style="width: 150px" value="#{reportBean.exchange}">
                <f:selectItem itemLabel="--select--" itemValue="--select--"/>
                <f:selectItem itemLabel="NSE" itemValue="nse"/>
                <f:selectItem itemLabel="BSE" itemValue="bse"/> 
                <p:ajax update="sym" listener="#{reportBean.wow}"/>
            </p:selectOneMenu>             
        <h:outputText value="Scrip Symbol :"/>
        <p:selectOneMenu value="#{reportBean.scripID}" id="sym" style="width: 100px">
            <f:selectItem itemLabel="All" itemValue="0"/>
            <f:selectItems var="scrip" value="#{reportBean.sl}" itemLabel="#{scrip.scripSymbol}" itemValue="#{scrip.scripID}"/>
        </p:selectOneMenu>

        <h:outputText value="Order Type :"/>
        <p:selectOneMenu style="width: 100px" value="#{reportBean.orderType}">
            <f:selectItem itemLabel="All" itemValue="All"/>
            <f:selectItem itemLabel="Buy" itemValue="B"/>
            <f:selectItem itemLabel="Sell" itemValue="S"/>
        </p:selectOneMenu>
            <p:commandButton ajax="true" update="dt" value="Submit" action="#{reportBean.getTradeByUserName()}" type="submit"/>
        </h:panelGrid>
        <p:dataTable id="dt" var="trade" widgetVar="scripTab" 
                     emptyMessage="No trade found with given criteria"  
                     value="#{reportBean.tradeList}"
                 paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
                 rowsPerPageTemplate="3,5,10" rows="3" >


        <p:column>....

код управляемого компонента:

    public void wow()
{    
        sl=getAllScripByExchange(exchange);
}

    public Integer getScripID() {
        return scripID;
    }

    public void setScripID(Integer scripID) {
        MasterScrip sm =getScripByID(scripID);
        if(sm!=null)
        this.scripSymbol=sm.getScripSymbol();
        this.scripID = scripID;
    }

    public List<TradeStock> getTradeList() {
        return tradeList;
    }

    public void setTradeList(List<TradeStock> tradeList) {
        this.tradeList = tradeList;
    }
     public List<service.TradeStock> getTradeByUserName()
    {
         HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpSession session = request.getSession(true);
        String uname = session.getAttribute("uname").toString();   
        tradeList= getTradeReport(scripID, uname, exchange, orderType);
        return tradeList;
    }

метод фасоли:

@Override
public Collection<TradeStock> getTradeReport(Integer scripID, String uname, String exchange, String tradeType) {

    String strQuery = null;
    strQuery = "Select t from TradeStock t where t.userName.userName = :userName ";
        if(! exchange.equalsIgnoreCase("All"))
    {
        strQuery += " and t.scripID.exchange = '" + exchange + "'";
    }         
    if(scripID>0)
    {
        strQuery += " and t.scripID.scripID = " + scripID;
    }
     if(! tradeType.equalsIgnoreCase("All"))
    {
        strQuery += " and t.orderID.buySell = '" + tradeType + "'";
    }

    Collection<TradeStock> c = em.createQuery(strQuery).setParameter("userName",uname).getResultList();

    return c;
}

почему значение не привязывается к свойствам bean? как мне это решить? (Меня беспокоит то, что тот же код работал вчера, но сегодня, когда я запустил тот же код, он начал меня беспокоить).

отредактировано:faces-config

    <faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<managed-bean>
<managed-bean-name>userReportBean</managed-bean-name>    
<managed-bean-class>UserReportBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/adminpages/editScrip.xhtml</from-view-id>    
<navigation-case>
    <from-action>#{manageScrip.updateScrip}</from-action>
    <from-outcome>success</from-outcome>
    <to-view-id>/adminpages/manageScrip.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/adminpages/addScrip.xhtml</from-view-id>    
<navigation-case>
    <from-action>#{manageScrip.addScrip}</from-action>
    <from-outcome>success</from-outcome>
    <to-view-id>/adminpages/manageScrip.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/adminpages/manageScrip.xhtml</from-view-id>    
<navigation-case>
    <from-action>#{manageScrip.returnEdit}</from-action>
    <from-outcome>success</from-outcome>
    <to-view-id>/adminpages/editScrip.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
    <managed-bean>
        <managed-bean-name>equityBean</managed-bean-name>
        <managed-bean-class>beans.equityBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>reportBean</managed-bean-name>
        <managed-bean-class>beans.reportBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
</faces-config>

person z22    schedule 01.06.2012    source источник


Ответы (1)


Это может произойти, если управляемый компонент был помещен в область запроса @RequestScoped. Каждый отдельный HTTP-запрос, включая Ajax-запросы, будет создавать совершенно новый экземпляр bean-компонента со всеми свойствами, установленными по умолчанию. Таким образом, список <f:selectItems> становится пустым, и, следовательно, в модели нет значения для установки.

Размещение bean-компонента в области представления с помощью @ViewScoped должно решить эту проблему.

Смотрите также:


Обновление: вам следует удалить эти <managed-bean> определения из faces-config.xml. Это был пережиток старого способа регистрации bean-компонентов JSF 1.x. Они только переопределят способ JSF 2.x для @ManagedBean конфигураций.

Не имеет прямого отношения к вашей конкретной проблеме, но эти записи <navigation-case> излишни в JSF 2.x. Возможно, вы неправильно читали старые книги/учебники/ресурсы по JSF 1.x вместо JSF 2.x?


Не связанный с конкретной проблемой, у вас есть серьезная дыра для атаки путем внедрения SQL в методе getTradeReport(). Вы не должны никогда объединять переменные, контролируемые пользователем, в строку SQL/JPQL. Вместо этого используйте параметризованные запросы с setParameter(). См. также предотвращение атак CSRF, XSS и SQL Injection в JSF.

person BalusC    schedule 01.06.2012
comment
когда я создаю bean-компонент @viewScoped, каскадное выпадающее меню не работает :( - person z22; 01.06.2012
comment
Очевидно, вы не управляете bean-компонентами с помощью JSF @ManagedBean. @ViewScoped работает только при использовании собственного @ManagedBean JSF. В CDI вам понадобится @ConversationScoped. Весной вам нужно будет создать собственную область видимости. - person BalusC; 01.06.2012
comment
и когда я делаю это javax.faces.bean.managedScoped и @viewScoped, тогда также значение не получает/не устанавливает. - person z22; 01.06.2012
comment
Что ж, тогда у вас есть серьезная проблема с окружением/конфигурацией, которую я не вижу в информации, предоставленной до сих пор в вопросе. - person BalusC; 01.06.2012
comment
тот же код работал отлично до вчерашнего дня, сегодня он не работает, что это такое? как мне это решить? - person z22; 01.06.2012
comment
Я понятия не имею, поскольку эта информация недоступна в информации, предоставленной до сих пор в вопросе. У меня нет волшебного шара, и я не могу телепортироваться к вам через Скотти, чтобы увидеть его собственными глазами. - person BalusC; 01.06.2012
comment
я отредактировал свой вопрос, включив в него Faces-config, пожалуйста, обратитесь к нему и помогите мне - person z22; 01.06.2012
comment
Смотрите обновление ответа. По какой-то причине вы переопределили эти bean-компоненты в Faces-config в старом стиле JSF 1.x. Не делай этого. - person BalusC; 01.06.2012
comment
Большое спасибо! Вы спаситель! теперь он работает, я удалил ‹managedBean› из Faces-config и сделал компонент видимым. - person z22; 01.06.2012