Spring-Boot Jersey: permite Jersey para servir contenido estático

La aplicación utiliza el arrancador JDK 8, Spring Boot y Spring Boot Jersey y está empaquetado como WAR (aunque se ejecuta localmente a través del complemento Spring Boot Maven).

Lo que me gustaría hacer es obtener la documentación que genero sobre la marcha (en tiempo de comstackción) como una página de bienvenida.

Intenté varios enfoques:

  1. dejando que Jersey sirva los contenidos estáticos configurando en application.properties el parámetro init adecuado como se describe aquí
  2. introduzca metadata-complete=false web.xml para listar el documento HTML generado como un archivo de bienvenida.

Nada de eso funcionó.

Me gustaría evitar tener que habilitar Spring MVC o crear un recurso de Jersey solo para servir un archivo estático.

¿Alguna idea?

Aquí está la clase de configuración de Jersey (sin éxito intenté agregar un ServletProperties.FILTER_STATIC_CONTENT_REGEX allí):

 @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); } } 

Y aquí está la clase de aplicación Spring Boot (traté de agregar una application.properties con spring.jersey.init.jersey.config.servlet.filter.staticContentRegex=/.*html pero no funcionó, no estoy exactamente seguro de qué la clave de propiedad debe estar aquí):

 @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); } } 

Permítanme simplemente indicar primero que la razón por la que no se servirá el contenido estático es debido a la asignación de servlets por defecto del servlet de Jersey, que es /* , y almacena todas las solicitudes. Por lo tanto, no se puede acceder al servlet predeterminado que sirve el contenido estático. Además de la siguiente solución, la otra solución es simplemente cambiar el mapeo de servlets. Puede hacerlo anotando su subclase ResourceConfig con @ApplicationPath("/another-mapping") o estableciendo la propiedad application.properties spring.jersey.applicationPath .


En cuanto a su primer acercamiento, ServletProperties un vistazo a las Jersey ServletProperties . La propiedad que está intentando configurar es FILTER_STATIC_CONTENT_REGEX . Afirma:

La propiedad solo es aplicable cuando Jersey servlet container está configurado para ejecutarse como un filtro; de lo contrario, esta propiedad se ignorará.

Spring Boot configura por defecto el contenedor de servlets Jersey como un servlet (como se menciona aquí ):

Por defecto, Jersey se configurará como un Servlet en @Bean de tipo ServletRegistrationBean denominado jerseyServletRegistration . Puede deshabilitar o anular ese bean creando uno propio con el mismo nombre. También puede usar un Filtro en lugar de un Servlet configurando spring.jersey.type=filter (en cuyo caso, @Bean para reemplazar o anular es jerseyFilterRegistration ).

Así que simplemente configure la propiedad spring.jersey.type=filter en su application.properties , y debería funcionar. He probado esto

Y para su información, ya sea que esté configurado como un filtro de servlet o un servlet, en lo que respecta a Jersey, la funcionalidad es la misma.

Como un lado, en lugar de utilizar el FILTER_STATIC_CONTENT_REGEX , donde necesita configurar algunos regex complejos para manejar todos los archivos estáticos, puede utilizar el FILTER_FORWARD_ON_404 . Esto es realmente lo que solía probar. Lo configuré en mi ResourceConfig

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

Para cualquiera que todavía no pueda hacer que esto funcione, seguí la respuesta proporcionada por @peeskillet y tuve que hacer un cambio adicional.

Anteriormente, había creado el siguiente método en Application.java .

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

El problema es que esto registró el servlet para la ruta /* , y luego configuró el archivo de configuración Jersey ResourceConfig .

Una vez que @Configuration el método anterior y coloqué la anotación @Configuration en mi clase ResourceConfig , noté que el recurso estático se podía recuperar a través de Spring Boot.

Para completar, este es un fragmento de mi ResourceConfig ahora.

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

Esta publicación de blog fue útil para determinar el enfoque de diferencia para ResourceConfig .