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

Apache Wicket 9.7.0如何自定义JS资源包的URL前缀路径

问题

我通过以下方式聚合JavaScript资源:

getResourceBundles().addJavaScriptBundle(MyWicketApplication.class,
                "js_bundle.js",
                wicketJQuery,
                wicketAjax,
                JavascriptResources.RESOURCE_1.getReference(),
                JavascriptResources.RESOURCE_2.getReference(),
                JavascriptResources.RESOURCE_3.getReference(),
                JavascriptResources.RESOURCE_4.getReference(),
                JavascriptResources.RESOURCE_5.getReference(),
                JavascriptResources.RESOURCE_6.getReference(),
                JavascriptResources.RESOURCE_7.getReference(),
                JavascriptResources.RESOURCE_8.getReference());

页面渲染后生成的资源URL为:

./wicket/resource/com.my.company.MyWicketApplication/js_bundle-ver-3CA0BF236223C36D08331F94E24FAAAE.js

我不介意URL中包含版本哈希的文件名部分,但希望将URL前缀./wicket/resource/com.my.company.MyWicketApplication替换为/resources/,得到如下形式的URL:

/resources/js_bundle-ver-3CA0BF236223C36D08331F94E24FAAAE.js

请问该如何实现?

解决方案

方法一:自定义资源URL生成器(精准控制)

通过实现IResourceUrlProvider接口,自定义资源URL的生成逻辑,仅替换目标前缀:

  1. 创建自定义资源URL提供类
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.request.resource.IResourceUrlProvider;
import org.apache.wicket.request.resource.ResourceReference;

public class CustomResourceUrlProvider implements IResourceUrlProvider {

    private final IResourceUrlProvider originalProvider;

    public CustomResourceUrlProvider(IResourceUrlProvider originalProvider) {
        this.originalProvider = originalProvider;
    }

    @Override
    public CharSequence getResourceUrl(ResourceReference reference, IResource.Attributes attributes) {
        CharSequence originalUrl = originalProvider.getResourceUrl(reference, attributes);
        if (originalUrl != null) {
            // 匹配原前缀并替换为目标路径
            return originalUrl.toString().replaceFirst(
                "\\./wicket/resource/com\\.my\\.company\\.MyWicketApplication",
                "/resources"
            );
        }
        return originalUrl;
    }

    @Override
    public CharSequence getResourceUrl(IRequestHandler handler) {
        return originalProvider.getResourceUrl(handler);
    }
}
  1. 在应用初始化时注册该类
    在MyWicketApplication的init()方法中添加以下代码:
@Override
protected void init() {
    super.init();

    // 替换默认的资源URL提供器
    getResourceSettings().setResourceUrlProvider(
        new CustomResourceUrlProvider(getResourceSettings().getResourceUrlProvider())
    );

    // 你的资源聚合代码保持不变
    getResourceBundles().addJavaScriptBundle(MyWicketApplication.class,
                "js_bundle.js",
                wicketJQuery,
                wicketAjax,
                JavascriptResources.RESOURCE_1.getReference(),
                JavascriptResources.RESOURCE_2.getReference(),
                JavascriptResources.RESOURCE_3.getReference(),
                JavascriptResources.RESOURCE_4.getReference(),
                JavascriptResources.RESOURCE_5.getReference(),
                JavascriptResources.RESOURCE_6.getReference(),
                JavascriptResources.RESOURCE_7.getReference(),
                JavascriptResources.RESOURCE_8.getReference());
}

方法二:全局修改资源前缀(简单快捷)

如果希望所有Wicket资源的URL前缀都改为/resources,可以直接修改资源设置的路径前缀:

@Override
protected void init() {
    super.init();

    // 全局设置资源路径前缀
    getResourceSettings().setResourcePathPrefix("/resources");

    // 你的资源聚合代码保持不变
    // ...
}

这种方式会统一修改所有Wicket托管资源的URL前缀,无需编写自定义类,但要注意避免和其他自定义资源路径冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:30:41