代码之家  ›  专栏  ›  技术社区  ›  Fred Porciúncula

@带有字符串查询的ResourceDependency

  •  2
  • Fred Porciúncula  · 技术社区  · 10 年前

    我希望通过文件版本的字符串查询实现缓存破坏,但我也希望使用@ResourceDependency。这就是我所拥有的:

    @ResourceDependency(name = "scrypt.js?v=version", library = "mylib", target = "head")
    

    我知道mojarra以前在字符串查询中遇到过问题 <f:outputScript> ,但已修复( stackoverflow question ). 但显然他们从未真正支持注释的字符串查询。

    问题出在 ResourceDependencyHandler#createComponentResource 。它调用 ResourceHandler#getRendererTypeForResourceName 返回 null 如果 name 提供了一个附加的字符串查询 ServletContext#getMimeType 这是一个无法意识到哑剧类型的人 application/javascript 当文件名附加了查询字符串时。

    有人知道解决方法吗?我目前正在与Mojarra 2.2.8合作。

    非常感谢。


    我提到的类的完全限定名称:

    com.sun.faces.application.annotation.ResourceDependencyHandler
    javax.faces.application.ResourceHandler
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Fred Porciúncula    10 年前

    根据@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 支持查询字符串(因此支持缓存破坏)。