@ResourceDependency与字符串查询

时间:2015-02-26 14:51:16

标签: jsf resources java-ee-6 jsf-2.2 mojarra

我想通过字符串查询实现缓存清除与文件版本,但我也想使用@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

1 个答案:

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