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 где угодно.
Благодарю.