我想通过字符串查询实现缓存清除与文件版本,但我也想使用@ResourceDependency。所以这就是我所拥有的:
@ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head")
我知道mojarra在<f:outputScript>
之前遇到字符串查询问题,但这已经修复(stackoverflow question)。但显然他们从未真正支持过注释的字符串查询。
问题出在ResourceDependencyHandler#createComponentResource
。如果提供的ResourceHandler#getRendererTypeForResourceName
附加了字符串查询,则会调用null
返回name
。这实际上一直追溯到ServletContext#getMimeType
。当有一个查询字符串附加到文件名时,那个无法实现mime类型的人是application/javascript
。
有人知道解决方法吗?我目前正在使用Mojarra 2.2.8。
谢谢。
我提到的类的完全限定名称:
com.sun.faces.application.annotation.ResourceDependencyHandler
javax.faces.application.ResourceHandler
答案 0 :(得分:2)
根据@Tarik的评论回答问题。
我将此添加到我的faces-config.xml
:
<application>
<resource-handler>my.package.MyResourceHandlerImplementation</resource-handler>
</application>
MyResourceHandlerImplementation
看起来像这样:
import com.sun.faces.application.resource.ResourceHandlerImpl;
public class MyResourceHandlerImplementation extends ResourceHandlerImpl {
@Override
public String getRendererTypeForResourceName(String resourceName) {
if (hasQueryString(resourceName)) {
resourceName = removeQueryString(resourceName);
}
return super.getRendererTypeForResourceName(resourceName);
}
private boolean hasQueryString(String resourceName) {
return resourceName.indexOf('?') != -1;
}
private String removeQueryString(String resourceName) {
return resourceName.substring(0, resourceName.indexOf('?'));
}
}
这就是你如何使@ResourceDependency
支持查询字符串(从而支持缓存清除)。