Zkoss不会将我的组件注入控制器

时间:2014-03-02 17:00:34

标签: java user-interface dependency-injection zk

将一个组件注入我的控制器时,我遇到了一个奇怪的问题:

public class AnalyticsController {

  @Wire("#fileSourceTree")
  private Tree fileSourceTree;
  @Wire("#chart")
  private Chart chart;
  ...

  @Override
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);

    TreeModel<TreeNode<Object>> model = session.getFileSourceTreeModel();

    if(model == null) {
      model = createFileSourceTreeModel();
      session.setFileSourceTreeModel(model);
    }

    fileSourceTree.setModel(model);

    log.debug("Chart is initialized? {}", chart != null);
    chart.setModel(new ChartModel(new LinkedList<ChartData>(), "", ""));
  }

analytics.zul

<?page title="Ana File Analytics" contentType="text/html;charset=UTF-8"?>
<?style src="css/nv.d3.css"?>
<zk>
  <borderlayout apply="my.package.AnalyticsController">
  ...
    <center>
        <vlayout>
            <hlayout valign="middle" style="padding: 10px 20px 5px">
                <label value="Type:" />
                <combobox id="statisticsTypeCombobox" model="${$composer.statisticsTypeModel}" />
                <label value="Interval:" />
                <combobox id="intervalCombobox" model="${$composer.intervalModel}" />
                <label value="From: " />
                <datebox id="fromDatebox" />
                <label value="to" />
                <datebox id="toDatebox" />
                <button id="showButton" label="Show" />
            </hlayout>
            <div style="padding: 5px 30px">
                <label id="chartHeader"
                    style="font: bold 28px Verdana Arial sans-serif; color: #2a5dda" />
            </div>
            <chart id="chart" height="500px" />
        </vlayout>
    </center>

我尝试在最后一行设置模型(NullPointerException)时得到chart.setModel(),如果没有注入图表(但正确注入了fileSourceTree)。问题是,当在我的本地机器上尝试它时,它可以工作但是当我将它部署到我们的开发环境时,我收到了这个NPE(我在其他组件中也有类似的问题)。我不知道这种行为的原因是什么以及如何解决它。

1 个答案:

答案 0 :(得分:0)

您的控制器需要从SelectorComposer<T>等作曲家继承。

来自ZK manual

  

为了简化UI控制器部分的实现,ZK提供了几个框架实现。例如,SelectorComposer,作为最流行的骨架之一,根据您指定的Java注释自动连接组件,变量和事件侦听器。

只需在代码中更改该行:

public class AnalyticsController extends SelectorComposer<BorderLayout>
相关问题