spring.resources.chain.strategy.content.enabled работает только с файлами .css - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь включить ContentVersionStrategy для файлов JavaScript и CSS в приложении Spring Boot, используя Thymeleaf в качестве движка представления.

В примере проекта Я добавил в приложение следующеефайл свойств:

# add classpath:/custom/ as a possible location
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/custom/

# enable ContentVersionStrategy
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**

Это работает для файлов .css в приложении, но не для файлов .js.Из того, что я могу прочитать, он также должен работать с файлами .js.

Я также пытался сделать это вручную, а не только в файле свойств с помощью:

@Configuration
public class WebConfiguration implements WebMvcConfigurer
{
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/", "classpath:/custom/"};

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS)
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}

Но это не такработать с файлами .css или .js.

Я пытался использовать Spring Boot с 2.1.4.RELEASE, 2.2.0.M2, 2.2.0.BUILD-SNAPSHOT, Java 11 и 12 на всякий случай.были какие-либо различия.

По какой-либо причине мой метод файла свойств, по-видимому, не применим к файлам .js?

Что-то явно не так с моей реализацией WebMvcConfigurer, что означает, что она не применяетсяв .css или .js?

1 Ответ

0 голосов
/ 02 июня 2019

Итак, после 5 часов копания в Spring, чтобы попытаться выяснить, почему хеш-значения содержимого для файлов javascript не генерируются, я заметил разницу между ссылками css и js:

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Test page</title>

    <link rel="stylesheet" th:href="@{/css/jquery-ui.min.css}"/>
    <link rel="stylesheet" th:href="@{/directory/select2.min.css}"/>
</head>
<body>
    <p>Text page</p>
    <script th:src="@{js/jquery.js}"></script>
    <script th:src="@{js/select2.min.js}"></script>
    <script th:src="@{directory/jquery-ui.min.js}"></script>
</body>
</html>

в тегах сценария отсутствует косая черта в начале. Добавление этого исправляет проблему.

Также нашел бит, который мне не хватало, чтобы сделать это вручную:

@Configuration
public class WebConfiguration implements WebMvcConfigurer
{
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/", "classpath:/custom/"};

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS)
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }

    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }
}

Мне нужно было добавить бин ResourceUrlEncodingFilter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...