You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZK中继承SelectorComposer的控制器获取Zk Sessions报错如何解决

问题根因

GenericForwardComposer默认会自动注入session、request等ZK隐式对象作为类成员变量,可直接调用;但SelectorComposer没有该自动注入逻辑,直接调用session变量会提示变量未定义错误。

解决方法

两种方案任选其一即可,推荐使用方法2,代码更符合SelectorComposer的使用规范:

方法1:主动获取当前Session

通过ZK执行上下文手动获取Session对象,无需额外注解:

  1. 新增import语句:import org.zkoss.zk.ui.Executions;
  2. 替换原session.getAttribute行代码为:
Session session = Executions.getCurrent().getSession();
DaoFactory daofactory = (DaoFactory) session.getAttribute("daofactory");

方法2:使用@WireVariable注解注入Session

SelectorComposer支持@WireVariable注解自动注入隐式对象,原有session.getAttribute代码无需修改:

  1. 新增import语句:import org.zkoss.zk.ui.select.annotation.WireVariable;
  2. 在类中添加Session成员变量并加注解:
@WireVariable
private Session session;

修改后完整代码示例

package com.ctrl;

import com.impl.ChartImpl;
import com.koneksi.DaoFactory;
import org.zkoss.chart.Charts;
import org.zkoss.chart.Legend;
import org.zkoss.chart.PlotLine;
import org.zkoss.zk.ui.Session;
import org.zkoss.chart.model.ChartsModel;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window;

public class LineBasicComposerCtrl extends SelectorComposer<Window> {
  
    @Wire
    Charts chart;
    // 若使用方法2,取消下面两行注释即可,无需手动调用Executions获取session
    // @WireVariable
    // private Session session;

    @Override
    public void doAfterCompose(Window comp) throws Exception {
        super.doAfterCompose(comp);
        // 若使用方法2,删除下面获取session的一行代码即可
        Session session = Executions.getCurrent().getSession();
        DaoFactory daofactory = (DaoFactory) session.getAttribute("daofactory");  
        
        chart.setModel((ChartsModel) ChartImpl.getCategoryModel(daofactory));    
        chart.getTitle().setX(-20);
        chart.getSubtitle().setX(-20);
        chart.getYAxis().setTitle("Temperature (°C)");
        PlotLine plotLine = new PlotLine();
        plotLine.setValue(0);
        plotLine.setWidth(1);
        plotLine.setColor("#808080");
        chart.getYAxis().addPlotLine(plotLine);
        chart.getTooltip().setValueSuffix("°C");
        Legend legend = chart.getLegend();
        legend.setLayout("vertical");
        legend.setAlign("right");
        legend.setVerticalAlign("middle");
        legend.setBorderWidth(0);
    }
}

内容的提问来源于stack exchange,提问作者Daryl Darussalam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:54:02