getRequestCycle()。url不在面板中工作

时间:2012-09-29 14:29:49

标签: java web-applications wicket

我需要wicket中组件的URL。当我使用页面时它可以正常工作,但是当使用面板时它不起作用。

public final class ImageP extends Panel {

    public ImageP(String id) {
        super(id);
        List<Mapp> list = Mapp.loadall(); //load image from database
        final Mapp asr = list.get(0);
        ByteArrayResource resource = new ByteArrayResource("image/jpeg", asr.getImage());
        Image image = new Image("img", resource);
        add(image);
        System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));
    }
}

此代码不起作用并引发异常,但是当我使用页面而不是面板getRequestCycle().urlFor(image, IResourceListener.INTERFACE)时,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

我敢打赌你有以下例外:

java.lang.IllegalStateException: No Page found for component [Component id = img]

这是因为RequestCycle对象在内部调用组件的getPage()方法,该方法是urlFor()方法的第一个参数,具有以下签名:

urlFor(Component component, RequestListenerInterface interface)

如果在面板的构造函数中调用方法urlFor(),则无法获取面板子节点的页面,因为面板尚未附加到页面。所以Wicket抛出“一个很好的例外”。

要解决该问题,您只需将代码移动到面板的onBeforeRender()方法即可。这样的事情:

@Override
protected void onBeforeRender() {
    //
    // ... init resource ...
    //

    Image image = new Image("img", resource);
    addOrReplace(image);
    System.out.println(getRequestCycle().urlFor(image, IResourceListener.INTERFACE));

    super.onBeforeRender();
}

P.S。我还假设您正在使用Wicket 1.4或更早版本,因为Wicket 1.5及更高版本中没有RequestCycle.urlFor(组件,侦听器)方法。因此,我认为在这种情况下,你的问题和我的答案都没有意义。