0

我正在开发一个使用 Spring (Spring MVC) 和 Hibernate 的项目,这两个都是最新版本。对于前端,我使用的是 Zk 6.5.0。这是问题所在:

我有一个这样的控制器:

public class SearchController extends SelectorComposer<Component> {

    private static final long serialVersionUID = 1L;

    @WireVariable("MjestaAutoComplete")
    private AutoComplete<Mjesta> mjesta;

    @Listen("onChanging = #mj")
    public void autocomplete(InputEvent event) {    

        if (mjesta == null) {
            Messagebox.show("Mjesta == Null");
            return;
        } else {
            mjesta.doSomething();
        }            

    }

}

Zul 页面如下所示:

<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<zk>
    <div apply="hr.restart.erp.web.controller.SearchController">
            <combobox id="mj" autocomplete="true" autodrop="true" />
    </div>
</zk>

这是使用 ZK JSP 标签的 jsp(只是相关部分):

<z:variable-resolver use="org.zkoss.zkplus.spring.DelegatingVariableResolver" />
<z:page>
     <z:div apply="hr.restart.erp.web.controller.SearchController">
        <z:combobox id="mj" autocomplete="true" autodrop="true"></z:combobox>
     </z:div>
</z:page>

如果我通过 jsp 的 include 指令在 jsp 中包含 zul 页面,则代码正常执行,即“mjesta”不为空。如果我删除指令并使用 zk jsp 标签而不是“mjesta”对象为空。当代码相同时,这怎么可能?我可以向自己解释这一点的唯一方法是“mjesta”没有自动接线,但这没有多大意义……有人能弄清楚吗?

4

3 回答 3

1

通过阅读评论,我想如果你写

public SearchController(){
  AutoComplete<Mjesta> mjesta = SpringUtil.getBean("MjestaAutoComplete");
}

mjesta不会为空吧?
无论此行为的原因如何,这都应该可以解决您的问题。
但是,我想原因应该在配置中,以便不会
在正确的地方调用 VariableResolver。最好通过将其与zk doc进行比较来检查您的配置。

于 2012-12-22T00:34:48.603 回答
1

这是一个解决方法:在 doAfterCompose() 中手动调用 Selectors.wireVariables()。

public class SearchController extends SelectorComposer {

    public void doAfterCompose(Component comp) throws Exception {

        super.doAfterCompose(comp);
        Selectors.wireVariables(getPage(), this, _resolvers);

    }

}

于 2012-12-25T06:39:18.797 回答
0

我相信这是一个错误。

我已经在这里向 ZK 提交了一张票。

消除了对 ZUL 或 ZKJSP 的尽可能多的依赖,我能够使用 VariableResolver 重现该问题。

我是MyVariableResolver这样创建的:

public class MyVariableResolver implements VariableResolver {

    @Override
    public Object resolveVariable(String name) throws XelException {
        System.out.println("Resolving variable: " + name);
        return null;
    }

}

并将其附加到MyController类似的位置:

@VariableResolver(MyVariableResolver.class)
public class MyController extends SelectorComposer<Component> {

    private static final long serialVersionUID = 1L;

    @WireVariable
    public Object wireMePlease;

}

ZUL 文件就变成了简单的:

<div apply="MyController"/>

ZKJSP 文件是:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.zkoss.org/jsp/zul" prefix="z"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <body>
        <z:page>
            <z:div apply="MyController"/>
        </z:page>
    </body>
</html>

评估 ZUL 文件时,MyVariableResolver调用 fetch wireMePlease

但是,在评估 ZKJSP 文件时,MyVariableResolver永远不会调用它。

于 2012-12-22T22:11:42.237 回答