Spring Boot, статические ресурсы и конфигурация MIME-типа
Я сталкиваюсь с проблемой конфигурации Spring Boot, с которой не могу разобраться... Я пытаюсь создать пример HelloWorld для HbbTV с Spring Boot, поэтому мне нужно обработать страницу "index.html" с помощью mime-type="приложение /vnd.hbbtv.xhtml+ XML"
мой index.html будет доступен как статическая страница, например, http://myserver.com/index.html?param=value.
с помощью следующего кода, независимо от того, как сильно я стараюсь, я получаю тип содержимого text/html.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//HbbTV//1.1.1//EN" "http://www.hbbtv.org/dtd/HbbTV-1.1.1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>MyApp HBBTV</title>
<meta http-equiv="content-type" content="Content-Type: application/vnd.hbbtv.xhtml+xml; charset=UTF-8" />
</head>
<body>
...
</body>
</html>
Поэтому я попытался добавить конечную точку "home()" в @Controller для принудительного ввода правильного mime-типа, и это работает.
@RestController
public class HbbTVController {
@RequestMapping(value = "/hbbtv", produces = "application/vnd.hbbtv.xhtml+xml")
String home() {
return "someText";
}
...
}
"Это работает" означает, что сервер Jetty предоставляет мне html-файл с правильным типом содержимого, содержащий тест someText.
Моя следующая попытка состояла в том, чтобы заменить @RestController на @Controller (тот же производной конфиг) и заменить "someText" на index.html.
@Controller
public class HbbTVController {
@RequestMapping(value = "/hbbtv", produces = "application/vnd.hbbtv.xhtml+xml")
String home() {
return "index.html";
}
...
}
Что ж, он правильно обслуживает мой index.html, но Content-Type неправильный: text/html вместо application/vnd.hbbtv.xhtml+xml. Кроме того, я не хочу получать доступ к myserver.com/hbbtv для получения index.html, но напрямую к myserver.com/index.html.
Как я мог это сделать?
Спасибо...
2 ответа
Ну вот, наконец, я нашел "решение для загрузки, совместимое с Spring". Это то же самое, что предложил Джейми Бёрч, но реализовано с помощью механизмов Spring.
@Configuration
public class HbbtvMimeMapping implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
mappings.add("html", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
mappings.add("xhtml", "application/vnd.hbbtv.xhtml+xml; charset=utf-8");
container.setMimeMappings(mappings);
}
}
Я расширю комментарии, предоставленные @Cheloute Sping boot, с типами mime по умолчанию https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/MimeMappings.java
чтобы переопределить уже установленный тип mime, вы должны сначала удалить его
Вот пример того, что я использовал для переопределения js и css
@Configuration
public class CustomServletConfiguration implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
mappings.remove("js");
mappings.add("js", "application/javascript;charset=utf-8");
mappings.remove("css");
mappings.add("css", "text/css;charset=utf-8");
factory.setMimeMappings(mappings);
factory.setPort(9000);
}
}
Не могу помочь со стороной Spring Boot, но если вы не получили других ответов, попробуйте следующее:
Установите тип файла как
.xhtml
скорее, чем.html
,Предоставить сопоставление от
.xhtml
MIME типapplication/vnd.hbbtv.xhtml+xml
на вашем сервере Jettymime.properties
файл. Еще несколько подробностей о том, как это сделать, здесь.