Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf @带字符串查询的ResourceDependency_Jsf_Resources_Java Ee 6_Jsf 2.2_Mojarra - Fatal编程技术网

Jsf @带字符串查询的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。这就是我所拥有的:

@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('?'));
    }

}