2015-02-26 4 views
2

Я хочу реализовать переполнение кэша через строковый запрос с версией файла, но я также хочу использовать @ResourceDependency. Так это то, что у меня есть:@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 
+0

По-видимому, для этого нет решения. Они придумали идею иметь одну аннотацию для Javascript и CSS-файлов вместо одной отдельной аннотации для каждого типа ресурса (например, и ), поэтому они полагаются на ServletContext # getMimeType, чтобы выяснить тип содержимого. Печально то, что реализации ServletContext # getMimeType обычно не знают, как обрабатывать строки запросов (т. Е. «? V = версия»), тем самым нарушая все это. –

+0

Я думаю, что это может быть обходным путем на ваш вопрос: http://stackoverflow.com/questions/4268345/how-can-i-implement-css-versioning-to-solve-cache-issues-using-jsf-2- houtpu – Tarik

+0

@Tarik Большое вам спасибо! Я не знал о декораторе . Я использовал его, чтобы указать на мою собственную реализацию ResourceHandler, где я переопределил getRendererTypeForResourceName, чтобы он мог обрабатывать строки запроса. –

ответ

2

Отвечая на вопрос, основанный на @ комментарий Тарика.

Я добавил это к моему 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 строки запроса поддержки (поддерживая тем самым кэш перебора).

+1

Этот код отлично работал для меня, хотя вместо этого я расширяю javax.faces.application.ResourceHandlerWrapper. –

Смежные вопросы