Jsf @带字符串查询的ResourceDependency
我想通过文件版本的字符串查询实现缓存破坏,但我还想使用@ResourceDependency。这就是我所拥有的:Jsf @带字符串查询的ResourceDependency,jsf,resources,java-ee-6,jsf-2.2,mojarra,Jsf,Resources,Java Ee 6,Jsf 2.2,Mojarra,我想通过文件版本的字符串查询实现缓存破坏,但我还想使用@ResourceDependency。这就是我所拥有的: @ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head") 我知道mojarra以前在的字符串查询中遇到过问题,但这已经得到了修复()。但很显然,他们从未真正支持注释的字符串查询 问题出在ResourceDependencyHandler\createComponentR
@ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head")
我知道mojarra以前在
的字符串查询中遇到过问题,但这已经得到了修复()。但很显然,他们从未真正支持注释的字符串查询
问题出在ResourceDependencyHandler\createComponentResource
中。它调用ResourceHandler#GetRenderTypeForResourceName
,如果提供的name
附加了字符串查询,则返回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>
这就是如何使
@ResourceDependency
支持查询字符串(从而支持缓存破坏)。显然没有解决方案。他们想到了为Javascript和CSS文件提供一个注释的想法,而不是为每种资源类型(如和)提供一个不同的注释,因此他们依靠ServletContext#getMimeType来确定内容类型。可悲的是,ServletContext#getMimeType实现通常不知道如何处理查询字符串(即“?v=version”),从而破坏了整个过程。我认为这可能是解决您的问题的一个方法:@Tarik非常感谢!我不知道装饰师的事。我用它来指出我自己的ResourceHandler实现,在那里我重写了GetRenderTypeForResourceName,这样它就可以处理查询字符串。不客气,很高兴它有帮助:)虽然我扩展了javax.faces.application.ResourceHandlerWrapper,但这段代码对我来说非常有效。
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('?'));
}
}