Spring Boot: Превосходный значок

Как я могу переопределить значок Spring Boot?

НОТАВот еще один мой вопрос, который предлагает другое решение, которое не включает никакого кодирования:Spring Boot: возможно ли использовать внешние файлы application.properties в произвольных каталогах с толстой флягой? Это для application.properties, но оно также может быть применено к favicon. Фактически, сейчас я использую этот метод для переопределения favicon.

Если я реализую класс, который имеет @EnableWebMvc, класс Spring Boot WebMvcAutoConfiguration не загружается, и я могу обслуживать свой собственный значок, поместив его в корневой каталог статического содержимого.

В противном случае WebMvcAutoConfiguration регистрирует bean-компонент faviconRequestHandler (см. Источникhttps://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java) и он служит значком «зеленый лист», который находится в каталоге основных ресурсов Spring Boot.

Как я могу переопределить его, не реализовав класс, который сам имеет @EnableWebMvc, тем самым отключив всю функциональность конфигурации по умолчанию класса WebMvcAutoConfiguration в Spring Boot?

Кроме того, поскольку я хочу, чтобы файл значков обновлялся как можно скорее на стороне клиента (веб-браузера), я хочу установить период кэширования файла favicon равным 0. (как в следующем коде, который я использую для своего «статическое» содержимое веб-приложения и файлы сценариев, которые должны быть обновлены на стороне клиента как можно скорее после изменения файла.)

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

Таким образом, просто найти место для сохранения файла favicon.ico, которого может не хватить faviconRequestHandler Spring Boot.

ОБНОВИТЬ

Теперь я знаю, что могу переопределить файл по умолчанию, поместив файл favicon в каталог src / main / resources. Но проблема с периодом кэша все еще остается.
Кроме того, предпочтительно помещать файл favicon в каталог, в который помещаются статические веб-файлы, а не в каталог ресурсов.

ОБНОВИТЬ

Хорошо, мне удалось переопределить по умолчанию. Я сделал следующее:

@Configuration
public class WebMvcConfiguration
{
    @Bean
    public WebMvcConfigurerAdapter faviconWebMvcConfiguration()
    {
        return new FaviconWebMvcConfiguration();
    }

    public class FaviconWebMvcConfiguration extends WebMvcConfigurerAdapter
    {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry)
        {
            registry.setOrder(Integer.MIN_VALUE);
            registry.addResourceHandler("/favicon.ico")
                .addResourceLocations("/")
                .setCachePeriod(0);
        }
    }
}

По сути, я переопределил стандартный по умолчанию, добавив обработчик ресурсов с наивысшим порядком, вызвав Registry.setOrder (Integer.MIN_VALUE).

Поскольку значение по умолчанию в Spring Boot имеет значение порядка (Integer.MIN_VALUE + 1), (см. Класс FaviconConfiguration вhttps://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java) мой обработчик побеждает.

Это нормально? Есть ли другой способ (что-то более мягкое, чем то, что я сделал)?

ОБНОВИТЬ

Это не хорошо. Когда я звонюregistry.setOrder(Integer.MIN_VALUE)На самом деле я поднимаю приоритет всех обработчиков ресурсов. Итак, когда я добавляю следующий код в другойWebMvcConfigurerAdapterфактически весь http-запрос направляется этому обработчику ресурса, предотвращая любую динамическую обработку Java-кодом.

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

Нужно другое решение.

ОБНОВИТЬ

Пока я не смог найти способ переопределить функцию favicon, которую предоставляет Spring Boot.
Может быть, есть способ добавить добавить свой собственныйHandlerMapping боб, но я не знаю, как это сделать.

Теперь я могу выбрать один из следующих вариантов:

Есть класс, который имеет@EnableWebMvc таким образом отключение Spring BootWebMvcAutoConfiguration класс. (Я могу скопировать кодWebMvcAutoConfiguration класс и удалить функциональность favicon)Откажитесь от свободы размещения файла favicon в произвольном месте и поместите его в каталог ресурсов, как того требует функциональность favicon в Spring Boot. И игнорировать проблему кеширования.

Но ни один из вариантов не является удовлетворительным.
Я просто хочу поместить файл favicon в мои статические веб-файлы (это может быть любой каталог, так как я могу изменить корень документа) и решить проблему с кэшированием.
Я что-то пропустил?
Любое предложение будет с благодарностью.

ОБНОВИТЬ

Кстати, причина, по которой я хочу изменить расположение значка favicon и других статических файлов, заключается в следующем. Пока это в основном проблема среды разработки.

Я создаю одностраничное веб-приложение (SPA).

Библиотеки / Каркасы:

Для серверной части я использую Spring. (конечно)Для клиента (веб-браузера) я использую AngularJS.

Инструменты:

Для серверной части я использую Spring Tool Suite.Для клиентской части я использую WebStorm.

Основная структура каталогов:

ProjectRoot\
    src\
    bin\
    build\
    webapp\
    build.gradle
Источник: Где находятся мои исходные файлы Java Spring.bin: Где Spring Tool Suite размещает выходные данные сборки.build: где 'gradle build' размещает результаты своей сборки.webapp: где находятся исходные файлы моего клиента (.js, .css, .htm и favicon). Таким образом, это каталог проекта WebStorm. (Я могу изменить имя каталога при необходимости)

Что я хочу это:

Чтобы иметь возможность изменять и тестировать мой клиентский код без перестройки / перезапуска моего приложения на сервере Spring. Таким образом, код клиента не должен быть помещен в файл JAR. Anyways Spring Tool Suite вообще не создает JAR-файл (по крайней мере, для текущей конфигурации)Чтобы иметь возможность протестировать мое приложение на сервере Spring с клиентским кодом, легко переключаться между выводом Spring Tool Suite и выходом gradle. Таким образом, клиентский код должен быть доступен как из серверного приложения вbuild подкаталог (на самом делеbuild\libs) и серверное приложение вbin каталог.Когда я изменяю код клиента, он должен быть немедленно доступен для веб-браузера. Таким образом, браузер не должен кэшировать его на неопределенный срок и всегда должен запрашивать сервер для обновления.При развертывании клиентский код должен быть изменяемым без перестройки / перезапуска серверного приложения. Поэтому код клиента не должен быть помещен в файл JAR.

Что касается проблемы с кешем:

Без setCachePeriod (0) для addResourceHandlers () Google Chrome кэширует файл неограниченное время, не запрашивая обновления у сервера. Он даже не подключается к серверу. (Инженеры Google говорят, что поведение правильное.) Поэтому все, что я могу сделать, - это вручную очистить кеш браузера. Это разочаровывает среду разработки и неприемлемо для среды производства.

Кстати, модуль express.js в Node.js предоставляет разумный заголовок HTTP по умолчанию, поэтому Google Chrome запрашивает обновления у сервера. Когда я рассмотрел заголовки HTTP, которые Spring и express.js создают с помощью Fiddler, они были другими.

Любые предложения по улучшению моей среды будут оценены.
Поскольку я новичок в Spring, я могу что-то упустить.

ОБНОВИТЬ

Наконец-то у меня есть рабочий код. Это выглядит следующим образом:

@Configuration
public static class FaviconConfiguration
{
    @Bean
    public SimpleUrlHandlerMapping myFaviconHandlerMapping()
    {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MIN_VALUE);
        mapping.setUrlMap(Collections.singletonMap("/favicon.ico",
            myFaviconRequestHandler()));
        return mapping;
    }

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    protected ResourceHttpRequestHandler myFaviconRequestHandler()
    {
        ResourceHttpRequestHandler requestHandler =
            new ResourceHttpRequestHandler();
        requestHandler.setLocations(Arrays
            .<Resource> asList(applicationContext.getResource("/")));
        requestHandler.setCacheSeconds(0);
        return requestHandler;
    }
}

Обратите внимание на имена бинов. Я добавил «мой», чтобы избежать конфликта имен.
Сам по себе контекст автопроводки кажется неловким, но он был необходим для имитации кода вorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistration.addResourceLocations().

Теперь у меня есть обработчик favicon без проблем с кэшированием, и я могу разместить файл favicon где угодно.
Благодарю.

Ответы на вопрос(6)

Ваш ответ на вопрос