Spring-Boot Jersey: разрешить Джерси обслуживать статический контент

Приложение использует JDK 8, Spring Boot & Spring Boot Jersey starter и упакован как WAR (хотя он локально запускается через плагин Spring Boot Maven).

Я хотел бы сделать, чтобы получить документацию, которую я генерирую на лету (во время сборки) в качестве приветственной страницы.

Я попробовал несколько подходов:

  1. позволяя Джерси обслуживать статическое содержимое, настраивая в application.properties собственный параметр init, как описано здесь
  2. введите metadata-complete=false web.xml , чтобы перечислить сгенерированный HTML-документ в качестве файла приветствия.

Ничего из этого не получилось.

Я бы хотел избежать включения Spring MVC или создания ресурса Джерси только для обслуживания статического файла.

Есть идеи?

Вот class конфигурации Джерси (я безуспешно пытался добавить ServletProperties.FILTER_STATIC_CONTENT_REGEX ):

 @ApplicationPath("/") @ExposedApplication @Component public class ResourceConfiguration extends ResourceConfig { public ResourceConfiguration() { packages("xxx.api"); packages("xxx.config"); property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true); property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true); } } 

И вот class приложения Spring Boot (я попытался добавить application.properties с spring.jersey.init.jersey.config.servlet.filter.staticContentRegex=/.*html но это не сработало, я не совсем уверен, что ключ свойства должен быть здесь):

 @SpringBootApplication @ComponentScan @Import(DataConfiguration.class) public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

Позвольте мне сначала указать, что причина, по которой статический контент не будет обслуживаться, – это из-за стандартного отображения сервлета сервлета Джерси, который является /* , и вызывает все запросы. Таким образом, сервлет по умолчанию, обслуживающий статический контент, не может быть достигнут. Помимо решения ниже, другое решение – просто изменить отображение сервлета. Вы можете сделать это, либо аннотируя свой подclass ResourceConfig с помощью @ApplicationPath("/another-mapping") либо установите свойство application.properties spring.jersey.applicationPath .


Что касается вашего первого подхода, взгляните на Jersey ServletProperties . Свойство, которое вы пытаетесь настроить, – FILTER_STATIC_CONTENT_REGEX . Говорится:

Свойство применимо только тогда, когда контейнер сервлета Джерри настроен на запуск в качестве фильтра, иначе это свойство будет проигнорировано

Spring Boot по умолчанию настраивает контейнер сервлетов Джерси в качестве сервлета (как указано здесь ):

По умолчанию Джерси будет настроен как @Bean в @Bean типа ServletRegistrationBean именем jerseyServletRegistration . Вы можете отключить или переопределить этот bean-компонент, создав одно из ваших собственных с тем же именем. Вы также можете использовать фильтр вместо spring.jersey.type=filter установив spring.jersey.type=filter (в этом случае @Bean для замены или переопределения – это jerseyFilterRegistration ).

Поэтому просто установите свойство spring.jersey.type=filter в свой application.properties , и он должен работать. Я проверил это.

И FYI, независимо от того, настроен ли он как сервлет-фильтр или сервлет, что касается Джерси, функциональность такая же.

В стороне, а не с помощью FILTER_STATIC_CONTENT_REGEX , где вам нужно настроить некоторое сложное регулярное выражение для обработки всех статических файлов, вы можете использовать FILTER_FORWARD_ON_404 . На самом деле это то, что я использовал для тестирования. Я просто установил его в своем ResourceConfig

 @Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { packages("..."); property(ServletProperties.FILTER_FORWARD_ON_404, true); } } 

Для тех, кто все еще не может заставить это работать, я последовал за ответом, предоставленным @peeskillet, и должен был внести дополнительные изменения.

Раньше я создал следующий метод в Application.java .

 @Bean public ServletRegistrationBean jerseyServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*"); registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName()); return registration; } 

Проблема в том, что он зарегистрировал сервлет для пути /* , а затем установил конфигурационный файл Jersey ResourceConfig .

Как только я удалил вышеуказанный метод и разместил аннотацию @Configuration в моем classе ResourceConfig , я заметил, что статический ресурс может быть восстановлен с помощью Spring Boot.

Для полноты, это fragment моего ResourceConfig .

 @Configuration public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // Application specific settings property(ServletProperties.FILTER_FORWARD_ON_404, true); } } 

Это сообщение в блоге было полезно для определения разностного подхода для ResourceConfig .

  • Добавить сервлет-фильтр в приложении Spring Boot
  • Spring Boot + JPA: аннотация annotations имени столбца игнорируется
  • Spring Boot: не удается получить доступ к controllerу REST на localhost (404)
  • java.lang.NoClassDefFoundError: org / springframework / core / env / ConfigurableEnvironment
  • Возrotation объекта JSON в качестве ответа в Spring Boot
  • Spring-Boot: Как установить свойства пула JDBC, например максимальное количество соединений?
  • Запустите главную роль Spring-boot с помощью IDE
  • Как исключить classы AutoConfiguration в тестах Spring Boot JUnit?
  • Как получить доступ к значению, определенному в файле application.properties в Spring Boot
  • Spring Boot перенаправляет HTTP на HTTPS
  • Рассмотрим определение компонента типа «package» в вашей конфигурации
  • Давайте будем гением компьютера.