@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 支持查询字符串(从而支持缓存清除)的方式。