具有命名参数的已安装映射器也会接收图像请求

时间:2013-05-12 11:15:51

标签: wicket wicket-1.6 wicket-6

在我的应用程序中,我安装了以下URL:

this.mountPage("/details/${site}", MerchantDetailPage.class);

因此,例如../details/anything的请求将使用pageparameter创建MerchantDetailPage的实例:site = anything。

MerchantDetailPage的构造函数:

public MerchantDetail(final PageParameters parameters) {
    super();

    org.apache.wicket.util.string.StringValue storeParameter = parameters.get("site");
    if (!storeParameter.isEmpty()) {
        this.store = this.service.getStoreByQBonSiteWithCategoriesDescriptionsRegionAndAddress(storeParameter.toString());
    }

    if (store == null) {
        throw new RestartResponseAtInterceptPageException(Application.get().getHomePage());
    }

    // Build the page
    this.createPage(this.store, null);
}

这似乎工作正常,直到我注意到构造函数被调用了4次。 经过一些挖掘后,我发现构造函数被调用一次,参数为site = anything,然后是另外3次,对于页面上的3个图像; e.g:

<img wicket:id="store_no_image" src="./images/shop_no_logo_big.png" alt="logo" />

因此,对于此资源,Wicket也调用此页面,但使用参数:site = images。

因此,商店为null,因此对图片的请求会重定向到主页=&gt;找不到图像。

为什么会这样?为什么wicket试图通过页面挂载处理资源请求?

一些评论意见:

  • MerchantDetailPage还有另一个构造函数,它直接从代码中调用,并接受商店id作为参数。在这种情况下,问题不会发生。
  • 如果我使用图片的绝对网址确实有用(不会为图片请求进入MerchantDetailPage)

1 个答案:

答案 0 :(得分:2)

嗯......你的页面位于

/detail/anything

已正确映射到您的商家详细信息页面...

您的图片位于

/detail/images/shop_no_logo_big.png

和类似,已正确映射到您的商家详细信息页面... 挂载路径不知道也不关心它是页面请求还是资源请求。总而言之,您可能需要使用挂载路径动态创建资源...

因此解决方案是将图像移动到与您的装载路径不匹配的位置。