2012-02-08 3 views
3

Я реализую систему перебора кеша для приложения Spring MVC.Spring MVC: использование подстановочных знаков в <mvc: resources>

Чтобы эта система работала, я должен удалить «код перебора кеша» с заданного URL-адреса. Скажем, мой сгенерированный код кэширования - «123», и у меня есть URL-адрес .css, который: /public-123/css/style.css. В этом примере я хочу, чтобы /public/css/style.css был успешно вызван (-123 должен быть удален).

Это работает в моем «MVC-config.xml» контекст файла:

<mvc:resources mapping="/public-123/**" location="/public/" /> 

Но я также хотел бы любой кэш перебора кода, чтобы работать, даже если это не ток один. Например, мне бы хотелось /public-456/css/style.css получить файл style.css.

Если я пытаюсь добавить другой подстановочные к отображению:

<mvc:resources mapping="/public-*/**" location="/public/" /> 

Это не работает! Я получаю 404 ....

Как я могу указать атрибут «mapping», чтобы любой код после того, как «общедоступная» часть хорошо управлялась?

ответ

0

Один из способов справиться с этим использовать Spring EL, как показано на Spring docs:

<mvc:resources mapping="/resources-#{applicationProps['application.version']}/**" location="/public-resources/"/> 

Вы могли бы хранить «123» часть в файле свойств, так что только получает устанавливается один раз. Например. через property-placeholder:

<context:property-placeholder location="classpath:myApp.properties"/> 
<mvc:resources mapping="/resources-${cache.code}/**" location="/public-resources/"/> 

Это имеет то преимущество, что в состоянии прочитать этот код на ваших страницах JSP (для формирования ссылок) через то же значение свойства.

+0

Благодарности nickdos, но это то, что я уже использую на самом деле! Я упростил код, чтобы задать вопрос о SO. Я действительно хочу, чтобы код _any_ был удален, а не только тот, который будет определен в файле свойств. – electrotype

+0

Достаточно честный. Включили ли вы регистрацию уровня DEBUG для org.springframework, он мог бы сообщить больше информации о том, что происходит. Я думаю, вам придется вникать в код Spring и посмотреть, почему внутренняя * не попадает. Возможно, вам придется расширить один из классов, чтобы самостоятельно обрабатывать внутренний «*». – nickdos

+0

Вот что я получаю на уровне DEBUG: http://pastebin.com/jCTbtR2y – electrotype

0

мне удалось получить эту работу вручную определяя ResourceHttpRequestHandler для обработки активов, которые находятся в файловой системе наряду с <mvc:resources /> тега:

<bean id="assetsResourceHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler"> 
    <property name="locations"> 
    <list> 
     <bean class="org.springframework.core.io.UrlResource"> 
     <constructor-arg value="file:#{applicationProps['assets.basedir']}"></constructor-arg> 
     </bean> 
    </list> 
    </property> 
</bean> 
+0

Каково имя вашего файла свойств? –

0

Я предполагаю, что вы делаете это, чтобы достичь кэша перебора для ваших статического Ресурсы.

В то же время, Spring 4.1 has dedicated features for this, поэтому вы можете удалить много этой настраиваемой конфигурации.

Что-то вроде этого:

<mvc:resources mapping="/public/**" location="/public/"/> 
    <mvc:resource-chain resource-cache="true"> 
    <mvc:resolvers> 
     <mvc:version-resolver> 
     <mvc:content-version-strategy patterns="/**"/> 
     </mvc:version-resolver> 
    </mvc:resolvers> 
    </mvc:resource-chain> 
</mvc:resources> 
Смежные вопросы