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的生成逻辑,仅替换目标前缀:
- 创建自定义资源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); } }
- 在应用初始化时注册该类
在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
相关产品推荐
相关产品推荐

