@ResourceDependency 带字符串查询
@ResourceDependency with string query
我想通过文件版本的字符串查询实现缓存清除,但我也想使用@ResourceDependency。这就是我所拥有的:
@ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head")
我知道 mojarra 之前在 <f:outputScript>
的字符串查询方面遇到过问题,但这已得到修复 (Whosebug question)。但显然他们从未真正支持注释的字符串查询。
问题出在ResourceDependencyHandler#createComponentResource
。如果提供的 name
附加了字符串查询,它会调用 ResourceHandler#getRendererTypeForResourceName
那 returns null
。这实际上一直追溯到 ServletContext#getMimeType
。那是无法意识到 mime 类型的人是 application/javascript
当文件名附加查询字符串时。
有人知道解决这个问题的方法吗?我目前正在使用 Mojarra 2.2.8。
谢谢。
我提到的 类 的完全限定名称:
com.sun.faces.application.annotation.ResourceDependencyHandler
javax.faces.application.ResourceHandler
根据@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
支持查询字符串(从而支持缓存清除)的方式。
我想通过文件版本的字符串查询实现缓存清除,但我也想使用@ResourceDependency。这就是我所拥有的:
@ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head")
我知道 mojarra 之前在 <f:outputScript>
的字符串查询方面遇到过问题,但这已得到修复 (Whosebug question)。但显然他们从未真正支持注释的字符串查询。
问题出在ResourceDependencyHandler#createComponentResource
。如果提供的 name
附加了字符串查询,它会调用 ResourceHandler#getRendererTypeForResourceName
那 returns null
。这实际上一直追溯到 ServletContext#getMimeType
。那是无法意识到 mime 类型的人是 application/javascript
当文件名附加查询字符串时。
有人知道解决这个问题的方法吗?我目前正在使用 Mojarra 2.2.8。
谢谢。
我提到的 类 的完全限定名称:
com.sun.faces.application.annotation.ResourceDependencyHandler
javax.faces.application.ResourceHandler
根据@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
支持查询字符串(从而支持缓存清除)的方式。