【问题标题】:JSF Target Unreachable, ''0'' returned null: javax.el.PropertyNotFoundExceptionJSF 目标不可达,“0”返回 null:javax.el.PropertyNotFoundException
【发布时间】:2014-02-05 16:34:43
【问题描述】:

对象列表:

private ArrayList<LegBeanForInsert> listOfLegs;

我通过使用带有数组的符号来显示这个数组: 0 , 1 , .... 例如位置:

                     <p:selectOneMenu  value="#{otcdEventsBean.listOfLegs[0].fixvar}"
                            effect="fade" style="width:100px; height:25px"
                            panelStyle="width:80px" >
                            <f:selectItem itemLabel="Select" itemValue="" />
                            <f:selectItems value="#{otcdEventsBean.fixedVariableCodes}"  
                            itemValue="#{otcdEventsBean.listOfLegs[0].fixvar}" />
                            <p:ajax listener="#{otcdEventsBean.fixvarchange}" event="change" update="panelUpdate"/>
                        </p:selectOneMenu>

错误:

value="#{otcdEventsBean.listOfLegs[0].fixvar}":  Target Unreachable, ''0'' returned null: javax.el.PropertyNotFoundException

在我做的bean的构造函数中:

 public void initLeg(){
    for(int i=0;i<8;i++){
        LegBeanForInsert beanLeg = new LegBeanForInsert();

        beanLeg.setCallamount(new BigDecimal(0));

        beanLeg.setFixvar("");

        this.listOfLegs.add(beanLeg);
    }
}

这个方法被另一个页面调用,当页面被渲染时页面没有问题:

 public void setProduct(Object product1, Object product2) {
    System.out.println("BEGIN::setProduct: " + (String) product2);
    if (product1 instanceof EqdProduct) {
        this.eqdProdToedit = (EqdProduct) product1;

    } else if (product1 instanceof CURROPTRBTProduct) {
        this.rbtProdType = (CURROPTRBTProduct) product1;

    } else if (product1 instanceof COMAsianProduct) {
        this.comAsianProd = (COMAsianProduct) product1;

    } else if (product1 instanceof CRDProductType) {
        this.crdProduct = (CRDProductType) product1;

    } else if (product1 instanceof ComSwapProduct) {
        firstLegComSw = (ComSwapProduct) product1;

        if (product2 instanceof ComSwapProduct) {
            System.out.println("Com Sawp second prod");
            secondLegComSw = (ComSwapProduct) product2;
        }
    } else if (product1 instanceof List) {

        // bisogna settare LegBeanForInsert, LE GAMBE SONO 8 !!
        List<?> legs = (List<?>) product1;
        String s = (String) product2;
        System.out.println("setProduct 2nd arg: " + product2);

        if (s.equals("Legs")) {
            for (int i = 0; i < legs.size(); i++) {

                Leg leg = (Leg) legs.get(i);
                LegBeanForInsert beanLeg = new LegBeanForInsert();
                beanLeg.setCallamount(new BigDecimal(leg.getCallamount()));
                beanLeg.setCallcurrency(leg.getCallcurrency());
                beanLeg.setCallmaturity(leg.getCallmaturityNumber());
                beanLeg.setCodintord(leg.getCodintord());
                beanLeg.setDayconvention(leg.getDayconvention());
                beanLeg.setEnddate(leg.getEnddate());
                beanLeg.setEventcode(leg.getEventcode());
                beanLeg.setEventtype(leg.getEventtype());
                beanLeg.setExercisemode(leg.getExercisemode());
                beanLeg.setFixvar(leg.getFixvar());
                beanLeg.setEndDate(leg.getFmtenddate());
                beanLeg.setStartDate(leg.getFmtstartdate());
                beanLeg.setFrequency(leg.getFrequency());
                beanLeg.setFrequencymultiplier(leg.getFrequencymultiplier());
                beanLeg.setFrequencyunit(leg.getFrequencyunit());
                beanLeg.setInareas(leg.getInareas());
                beanLeg.setIndexname(leg.getIndexname());
                beanLeg.setMargin(leg.getMargin());
                beanLeg.setNotional(leg.getNotional());
                beanLeg.setNumber(leg.getNumber());
                beanLeg.setOptioncashdelivery(leg.getOptioncashdelivery());
                beanLeg.setOptionmaturity(leg.getOptionMatirityNumber());
                beanLeg.setOptiontype(leg.getOptiontype());
                beanLeg.setPaycurrency(leg.getPaycurrency());
                beanLeg.setPutamount(leg.getPutamount());
                beanLeg.setPutcurrency(leg.getPutcurrency());
                beanLeg.setPutmaturity(leg.getPutMatirityNumber());
                beanLeg.setQuantityunit(leg.getQuantityunit());
                beanLeg.setRate(leg.getRate());
                beanLeg.setRateconvention(leg.getRateconvention());
                beanLeg.setSign(leg.getSign());
                beanLeg.setStartdate(leg.getStartdate());
                beanLeg.setStrike(leg.getStrike());
                this.listOfLegs.add(beanLeg);
            }
        } else {
            System.out.println("MoneyD 2nd arg: " + product2);

            for (int i = 0; i < legs.size(); i++) {
                LegMoneyDeal leg = (LegMoneyDeal) legs.get(i);

                this.legMoneyD.add(leg);
            }
        }
    } else {
        // non nè nessuno di quelli bisogna settare a null tutto quanto
        otcdEvents = new OtcdEvents();
        crdProduct = new CRDProductType();
        firstLegComSw = new ComSwapProduct();
        secondLegComSw = new ComSwapProduct();
        comAsianProd = new COMAsianProduct();
        rbtProdType = new CURROPTRBTProduct();
        listOfLegs = new ArrayList<LegBeanForInsert>();
        legMoneyD = new ArrayList<LegMoneyDeal>();
        eqdProdToedit = new EqdProduct();
    }

}

构造函数:

  public OtcdEventsBean() {
    try {
        Context ctx = new InitialContext();
        otcdEvents = new OtcdEvents();
        crdProduct = new CRDProductType();
        firstLegComSw = new ComSwapProduct();
        secondLegComSw = new ComSwapProduct();
        comAsianProd = new COMAsianProduct();
        rbtProdType = new CURROPTRBTProduct();
        ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myoracleDS");
        rederField = true;
        listOfLegs = new ArrayList<LegBeanForInsert>();
        initLeg();

        eqdProdToedit = new EqdProduct();
        legMoneyD = new ArrayList<LegMoneyDeal>();
        legMoneyD.add(new LegMoneyDeal());
        legMoneyD.add(new LegMoneyDeal());

        fieldsEditingDisabled = false;

        loginBean = (LoginBean) FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{loginBean}", LoginBean.class);

        setFixedVariableCodes(new String[2]);
        getFixedVariableCodes()[0] = "Fixed";
        getFixedVariableCodes()[1] = "Variable";

        setSignPremiumCodes(new String[2]);
        signPremiumCodes[0] = "Pay";
        signPremiumCodes[1] = "Receive";

        setFrequencyUnitCodes(new String[4]);
        frequencyUnitCodes[0] = "day";
        frequencyUnitCodes[1] = "week";
        frequencyUnitCodes[2] = "month";
        frequencyUnitCodes[3] = "year";

        setCashDeliveryCodes(new String[2]);
        cashDeliveryCodes[0] = "C";
        cashDeliveryCodes[1] = "D";

        setOptionTypeCodes(new String[2]);
        optionTypeCodes[0] = "CALL";
        optionTypeCodes[1] = "PUT";
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

完整的 bean 代码:

 http://pastebin.com/EbfuSwHN

【问题讨论】:

  • 抱歉,我的上一条评论具有误导性。我现在唯一能想到的是您的listOfLegs 字段在给定的时间是空的。请发布您的托管 bean 定义以更好地分析问题。
  • @LuiggiMendoza 我发布了我的完整 bean 代码
  • 尝试将所有托管 bean 构造函数逻辑移动到 @PostConstruct public void init() 方法中,重新编译您的类,重新部署您的 Web 应用程序并对其进行测试。

标签: jsf jsf-2


【解决方案1】:

init 方法是如何调用的。也许这没有被调用?我在定义上没有看到新的 ArrayList。你什么时候在 ArrayList 上调用 new?您应该在 init 方法中得到一个空指针异常。您可以在循环之前将新的 ArrayList 添加到 init 方法的开头。还要记住,在 JSF 中 set 方法会被多次调用,因此您应该限制 set 方法中的代码。

【讨论】:

  • 在构造函数内部调用
  • 你是对的,如果我把它放在 handleChange 里面就可以了
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多