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 на вашем сервере Jetty mime.properties файл. Еще несколько подробностей о том, как это сделать, здесь.

Другие вопросы по тегам