Весенняя загрузка: переопределение favicon
как я могу переопределить фавикон Spring Boot?
Примечание: вот мой еще один вопрос, который обеспечивает другое решение, которое не включает в себя кодирование: Spring Boot: можно ли использовать внешнее приложение.свойства файлов в произвольных каталогах с жирной банкой? Это для применения.свойства, но он также может быть применен для фавикона. На самом деле, я использую этот метод для переопределения фавикона сейчас.
Если Я реализуйте класс, который имеет @EnableWebMvc, класс Webmvcautoconfiguration Spring Boot не загружается, и я могу обслуживать свой собственный фавикон, помещая его в корневой каталог статического содержимого.
в противном случае WebMvcAutoConfiguration регистрирует компонент 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);
}
Итак, просто найти место, чтобы сохранить фавикон.ICO-файл, что faviconRequestHandler отличием Весна загрузки может быть недостаточно.
обновление
теперь я знаю, что могу переопределить значение по умолчанию, поместив файл 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);
}
}
}
в принципе, я переопределил значение по умолчанию, добавив обработчик ресурсов с самым высоким порядком, вызвав реестр.setOrder(целое число.MIN_VALUE).
С по умолчанию один в Spring Boot имеет значение порядка (целое число.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 в arbitary location и поместите его в каталог ресурсов, как требует функциональность favicon Spring Boot. И игнорировать кэширование проблема.
но ни один из вариантов не является удовлетворительным.
Я просто хочу разместить файл favicon с моими статическими веб-файлами (которые могут быть любым каталогом, так как я могу изменить корень документа) и решить проблему кэширования.
Я что-то упустил?
Любое предложение было бы весьма признательно.
обновление
кстати, причина, по которой я хочу изменить расположение favicon и других статических файлов, заключается в следующем. Пока это в основном проблема среды разработки.
Я создаю одностраничное веб-приложение (SPA).
Библиотеки/Фреймворки:
- на стороне сервера я использую Spring. (конечно)
- для клиентской (веб-браузер) стороны, я использую AngularJS.
инструменты:
- для серверной части я использую Spring Tool Suite.
- на стороне клиента, я использую WebStorm.
Главная структура каталогов:
ProjectRoot
src
bin
build
webapp
build.gradle
- src: где находятся мои исходные файлы Spring java.
- bin: где Spring Tool Suite размещает свой вывод сборки.
- build: где 'gradle build' размещает свой вывод сборки.
- webapp: Где мои клиентские исходные файлы(.js,.стиль CSS. ,htm и favicon). Таким образом, это каталог проекта WebStorm. (Я могу изменить имя каталога, если это необходимо)
что я хочу это:
- чтобы иметь возможность изменять и тестировать мой клиентский код без восстановления/перезапуска моего приложения Spring server. Таким образом, клиентский код не должен быть помещен в файл jar. В любом случае Spring Tool Suite вообще не создает файл jar (по крайней мере, для текущей конфигурации)
- чтобы иметь возможность протестировать мое приложение Spring server с помощью клиентского кода, легко переключаясь между выходом Spring Tool Suite и выходом gradle. Так что клиентский код должен быть доступен из серверное приложение в
buildподкаталог (на самом делеbuildlibs) и серверное приложение в
6 ответов:
вы можете просто поставить свой собственный фавикон.ico в корне пути к классам или в любом из статических местоположений ресурсов (например,
classpath:/static). Вы также можете полностью отключить разрешение favicon с помощью одного флагаspring.mvc.favicon.enabled=false.или для получения полного контроля вы можете добавить HandlerMapping (просто скопируйте его из загрузки и дайте ему более высокий приоритет), например
@Configuration public static class FaviconConfiguration { @Bean public SimpleUrlHandlerMapping faviconHandlerMapping() { SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); mapping.setOrder(Integer.MIN_VALUE); mapping.setUrlMap(Collections.singletonMap("mylocation/favicon.ico", faviconRequestHandler())); return mapping; } @Bean protected ResourceHttpRequestHandler faviconRequestHandler() { ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler(); requestHandler.setLocations(Arrays .<Resource> asList(new ClassPathResource("/"))); return requestHandler; } }
ничего из этого мне не было нужно.
зачем переопределять значение по умолчанию, когда вы можете связать ресурс с сгенерированной JAR, которая будет иметь более высокий приоритет, чем по умолчанию.
для достижения индивидуального
favicon.icoфайл, я создалsrc/main/resourcesкаталог для моего приложения, а затем скопировалfavicon.icoфайл туда. Файлы в этом каталоге ресурсов перемещаются в корень скомпилированной JAR и, следовательно, ваш пользовательскийfavicon.icoнайдено перед обеспеченной весной один.выполнение вышеизложенного достигло того же эффекта, что и Ваше обновленное решение выше.
обратите внимание, что с v1.2. 0 вы также можете поместить файл в
src/main/resources/static.
мне очень нравится Springboot, потому что в целом он полон умных решений, но я отказываюсь регистрировать компонент приложения для предоставления фавикона, потому что это просто глупо.
Я просто добавил свою собственную ссылку на фавикон в моей html-странице.
<link rel="icon" type="image/png" href="images/fav.png">затем я переименовал свой фавикон и поместил его в
<ProjFolder>/src/main/resources/static/images/fav.pngтеперь у меня есть значок на вкладках браузера Chrome и Firefox и адресная строка Safari без использования Spring и Java, и я не должен придется гоняться за изменениями в Springboot в более новых версиях для такой тривиальной функциональности.
начиная с Spring Boot 1.2.2 и 1.1.11 вы можете легко отключить favicon по умолчанию с помощью
spring.mvc.favicon.enabled = falseсобственность.для получения дополнительной информации посетите:
новые версии загрузки (1.2 наверняка, но, возможно, и 1.1.8) позволяют вам просто поставить фавикон.ico в ваших статических ресурсах.
реестра.addResourceHandler("/роботы.формат txt.)"addResourceLocations("/");
реестра.addResourceHandler ("/favicon.ico").addResourceLocations("/");
роботы.txt, favicon.расположение файла ico: / src / main / resources
Я использовал spring boot 1.2.1
Comments