Весенняя загрузка: переопределение 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 зерно, но я не знаю как это сделать.



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




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

  2. откажитесь от свободы размещения файла 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) и серверное приложение в

691   6  

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

    Ничего не найдено.