java maven spring-boot jersey-2.0

java - Spring-Boot Jersey: permita que Jersey sirva contenido estático



maven jersey-2.0 (3)

La aplicación utiliza JDK 8, Spring Boot y Spring Boot Jersey starter y está empaquetada 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 el momento de la compilación) como una página de bienvenida.

Intenté varios enfoques:

  1. dejando que Jersey sirva el contenido estático configurando en application.properties el parámetro de inicio adecuado como se describe here
  2. introduzca un metadata-complete=false web.xml para enumerar 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 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 (intenté 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); } }


La configuración a continuación funcionó para mí

Conjunto

spring .jersey.type: filter

establecer FILTER_FORWARD_ON_404

@Configuration public class MyResourceConfig extends ResourceConfig { public MyResourceConfig () { try { register(XXX.class); property(ServletProperties.FILTER_FORWARD_ON_404, true); } catch (Exception e) { LOGGER.error("Exception: ", e); } } }

Nota: Use @Configuration en lugar de @component


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 .


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

En lo que respecta a su primer enfoque, eche un vistazo a Jersey ServletProperties . La propiedad que está intentando configurar es FILTER_STATIC_CONTENT_REGEX . Afirma:

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

Spring Boot por defecto configura el contenedor de servlet Jersey como un Servlet (como se menciona here ):

De manera predeterminada, Jersey se configurará como un Servlet en un @Bean del tipo ServletRegistrationBean llamado 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 configurado como filtro de servlet o un servlet, en lo que respecta a Jersey, la funcionalidad es la misma.

Como FILTER_STATIC_CONTENT_REGEX aparte, en lugar de usar FILTER_STATIC_CONTENT_REGEX , donde necesita configurar algunas expresiones regulares complejas para manejar todos los archivos estáticos, puede usar FILTER_FORWARD_ON_404 . Esto es realmente lo que solía probar. Acabo de configurarlo en mi ResourceConfig

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