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:
-
dejando que Jersey sirva el contenido estático configurando en
application.properties
el parámetro de inicio adecuado como se describe here -
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 tipoServletRegistrationBean
llamadojerseyServletRegistration
. Puede deshabilitar o anular ese bean creando uno propio con el mismo nombre. También puede usar un Filtro en lugar de un Servlet configurandospring.jersey.type=filter
(en cuyo caso,@Bean
para reemplazar o anular esjerseyFilterRegistration
).
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);
}
}