No puedo hacer que mi proyecto Spring-boot sirva contenido estático.
He colocado una carpeta nombrada static
debajo src/main/resources
. En su interior tengo una carpeta llamada images
. Cuando empaque la aplicación y la ejecute, no puede encontrar las imágenes que he puesto en esa carpeta.
He tratado de poner los archivos estáticos en public
, resources
y META-INF/resources
pero nada funciona.
Si jar -tvf app.jar puedo ver que los archivos están dentro del jar en la carpeta correcta:
/static/images/head.png
por ejemplo, pero llamando:, http://localhost:8080/images/head.png
todo lo que obtengo es un404
¿Alguna idea de por qué spring-boot no encuentra esto? (Estoy usando 1.1.4 BTW)
spring
spring-mvc
spring-boot
Vinicius Carvalho
fuente
fuente
@EnableWebMvc
(o equivalente) en tu aplicación. Eso desactivaría la configuración predeterminada de Boot MVC.Respuestas:
No para resucitar a los muertos después de más de un año, pero todas las respuestas anteriores pierden algunos puntos cruciales:
@EnableWebMvc
en su clase se deshabilitaráorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. Eso está bien si quieres un control completo, pero de lo contrario, es un problema.No es necesario escribir ningún código para agregar otra ubicación para recursos estáticos además de lo que ya se proporciona. Mirando
org.springframework.boot.autoconfigure.web.ResourceProperties
desde v1.3.0.RELEASE, veo un campostaticLocations
que se puede configurar enapplication.properties
. Aquí hay un fragmento de la fuente:Como se mencionó anteriormente, la URL de solicitud se resolverá en relación con estas ubicaciones. Por
src/main/resources/static/index.html
lo tanto , se servirá cuando la URL de solicitud sea/index.html
. La clase responsable de resolver la ruta, a partir de Spring 4.1, esorg.springframework.web.servlet.resource.PathResourceResolver
.La coincidencia de patrones de sufijo está habilitada de manera predeterminada, lo que significa que para una URL de solicitud
/index.html
, Spring buscará los controladores correspondientes/index.html
. Este es un problema si la intención es servir contenido estático. Para deshabilitar eso, extiendaWebMvcConfigurerAdapter
(pero no use@EnableWebMvc
) y anuleconfigurePathMatch
como se muestra a continuación:En mi humilde opinión, la única forma de tener menos errores en su código es no escribir código siempre que sea posible. Utilice lo que ya se proporciona, incluso si eso requiere un poco de investigación, el rendimiento lo vale.
fuente
A diferencia de lo que dice el arranque de primavera, para que mi jarra de arranque de primavera sirva el contenido: tuve que agregar registrar específicamente mi contenido src / main / resources / static a través de esta clase de configuración:
fuente
Tuve un problema similar, y resultó que la solución simple era extender mi clase de configuración
WebMvcAutoConfiguration
:No necesitaba ningún otro código para permitir que se sirviera mi contenido estático, sin embargo, puse un directorio llamado
public
debajosrc/main/webapp
y configuré a maven para que señalarasrc/main/webapp
como un directorio de recursos. Esto significa quepublic
se copiatarget/classes
y, por lo tanto, está en el classpath en tiempo de ejecución para que spring-boot / tomcat lo encuentre.fuente
Busque los Controladores asignados a "/" o sin ruta asignada.
Tuve un problema como este, obtuve 405 errores y me golpeé la cabeza con fuerza durante días. El problema resultó ser un
@RestController
controlador anotado que olvidé anotar con una@RequestMapping
anotación. Supongo que esta ruta asignada por defecto fue "/" y bloqueó la asignación de recursos de contenido estático.fuente
La configuración se puede hacer de la siguiente manera:
Importante aquí es que
WebMvcConfig
puede anular eladdResourceHandlers
método y, por lo tanto, debe invocar explícitamentesuper.addResourceHandlers(registry)
(es cierto que si está satisfecho con las ubicaciones de recursos predeterminadas, no necesita anular ningún método).Otra cosa que necesita ser comentado aquí es que esos lugares de recursos por defecto (
/static
,/public
,/resources
y/META-INF/resources
) se registrarán sólo si no hay ya un controlador de recursos asignada a/**
.A partir de este momento, si tiene una imagen con
src/main/resources/static/images
nombre,image.jpg
por ejemplo, puede acceder a ella utilizando la siguiente URL:http://localhost:8080/images/image.jpg
(el servidor se inició en el puerto 8080 y la aplicación se implementó en el contexto raíz).fuente
@EnableWebMvc
yWebMvcAutoConfigurationAdapter
. Gracias a lo grande!¿Revisaste los documentos de referencia de Spring Boot ?
También puede comparar su proyecto con la guía Servir contenido web con Spring MVC , o consultar el código fuente del proyecto spring-boot-sample-web-ui .
fuente
Estaba teniendo este problema exacto, luego me di cuenta de que lo había definido en mi aplicación.
Lo cual estaba anulando todo lo demás que había intentado. En mi caso, quería conservar ambos, así que solo guardé la propiedad y agregué:
Que sirvió archivos de src / main / resources / static como localhost: {port} /file.html.
Nada de lo anterior funcionó para mí porque nadie mencionó esta pequeña propiedad que podría haberse copiado fácilmente en línea para servir a un propósito diferente;)
¡Espero eso ayude! Pensé que encajaría bien en esta larga publicación de respuestas para personas con este problema.
fuente
spring.resources.static-locations=file:/var/www/static,classpath:static
en mi application.properties, pero no funcionó para mí. Estoy usando@EnableWebMvc
en mi clase de configuración.security.ignored
ysecurity.publicPaths
Creo que las respuestas anteriores abordan el tema muy bien. Sin embargo, agregaría que en un caso cuando tiene Spring Security habilitado en su aplicación, es posible que tenga que decirle específicamente a Spring que permita solicitudes a otros directorios de recursos estáticos como, por ejemplo, "/ static / fonts" .
En mi caso, tenía "/ static / css", "/ static / js", "/ static / images" permitido por defecto, pero / static / fonts / ** fue bloqueado por mi implementación de Spring Security.
A continuación se muestra un ejemplo de cómo arreglé esto.
fuente
Solo para agregar otra respuesta a una pregunta anterior ... La gente ha mencionado
@EnableWebMvc
que evitará que seWebMvcAutoConfiguration
cargue, que es el código responsable de crear los manejadores de recursos estáticos. Hay otras condiciones que evitarán que seWebMvcAutoConfiguration
cargue también. La forma más clara de ver esto es mirar la fuente:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/ WebMvcAutoConfiguration.java # L139-L141
En mi caso, estaba incluyendo una biblioteca que tenía una clase que se extendía desde la
WebMvcConfigurationSupport
cual es una condición que evitará la autoconfiguración:Es importante no extenderse nunca
WebMvcConfigurationSupport
. En cambio, extienda desdeWebMvcConfigurerAdapter
.ACTUALIZACIÓN: La forma correcta de hacer esto en 5.x es implementar WebMvcConfigurer
fuente
WebMvcConfigurer
.Esta solución me funciona:
Primero, coloque una carpeta de recursos debajo de webapp / WEB-INF, como sigue la estructura
En segundo lugar, en el archivo de configuración de primavera
Luego, puede acceder al contenido de sus recursos, como http: // localhost: 8080 / resource / image / yourimage.jpg
fuente
Hay 2 cosas a considerar (Spring Boot v1.5.2.RELEASE) - 1) Verifique todas las clases de Controlador para la anotación @EnableWebMvc, elimínela si hay alguna 2) Verifique las clases de Controlador para las que se usa la anotación: @RestController o @Controller . No mezcle el comportamiento Rest API y MVC en una clase. Para MVC use @Controller y para API REST use @RestController
Hacer más de 2 cosas resolvió mi problema. Ahora mi arranque de primavera está cargando recursos estáticos sin ningún problema. @Controller => load index.html => carga archivos estáticos.
fuente
Ponga recursos estáticos bajo el directorio:
agregue esta propiedad en el archivo application.properties
Puede acceder desde http: // localhost: 8080 / pdx / images / image.jpg
fuente
En caso de que surja el problema al iniciar la aplicación desde un IDE (es decir, a partir de Eclipse o IntelliJ Idea), y utilizando Maven, la clave de la solución está en la documentación de Inicio de Spring-boot :
La parte importante es agregar el
package
objetivo que se ejecutará antes de que la aplicación se inicie realmente. (Idea:Run
Menú,Edit Configrations...
,Add
, y seleccionarRun Maven Goal
y especificar elpackage
objetivo en el campo)fuente
Estoy usando 1.3.5 y alojo un montón de servicios REST a través de la implementación de Jersey. Eso funcionó bien hasta que decidí agregar un par de archivos HTML + js. Ninguna de las respuestas dadas en este foro me ayudó. Sin embargo, cuando agregué la siguiente dependencia en mi pom.xml, todo el contenido en src / main / resources / static finalmente se mostró a través del navegador:
Parece que spring-web / spring-webmvc es la dependencia transitiva importante que hace que la configuración automática de inicio de Spring se active.
fuente
FYI: También noté que puedo estropear una aplicación de arranque de resorte que funciona perfectamente y evitar que sirva contenido de la carpeta estática, si agrego un controlador de reposo incorrecto así
En este ejemplo, después de agregar el controlador incorrecto al proyecto, cuando el navegador solicita un archivo disponible en la carpeta estática, la respuesta de error es ' Método 405 no permitido '.
Observe que las rutas no están asignadas en el ejemplo de controlador incorrecto.
fuente
Estaba enfrentando el mismo problema en el arranque de primavera 2.1.3 diciendo que no se encontró el recurso 404. Quité a continuación de application.properties .
Se eliminó @enableWebMVC y se eliminó cualquier anulación de WebMvcConfigurer
También asegúrese de tener @EnableAutoConfiguration en su configuración.
Y ponga todos los recursos estáticos en src / main / resources / static y finalmente funcionó como magia ...
fuente
usando spring boot 2. *, tengo un controlador que se asigna a las rutas
GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
y mi aplicación deja de servir recursos.Sé que no es aconsejable tener tales rutas, pero todo depende de la aplicación que esté creando (en mi caso, no tengo más remedio que tener tales rutas)
así que aquí está mi truco para asegurarme de que mi aplicación sirva recursos nuevamente. Simplemente tengo un controlador que se asigna a mis recursos. Dado que la primavera coincidirá primero con una ruta directa antes que cualquiera que tenga variable, decidí agregar un método de controlador que se asigna
/imgaes/{name}
y se repite para otros recursosy esto resolvió mi problema
fuente
Tuve el mismo problema, usando gradle y eclipse y pasé horas tratando de resolverlo.
No se requiere codificación, el truco es que debe usar la opción de menú Nuevo-> Carpeta de origen (NO Nuevo -> Carpeta) para crear la carpeta estática en src / main / resources. No sé por qué esto funciona, pero hice una nueva -> carpeta de origen y luego llamé a la carpeta estática (luego el cuadro de diálogo de la carpeta de origen da un error que debe verificar: Actualice los filtros de exclusión en otras carpetas de origen para resolver el anidamiento). La nueva carpeta estática agregué index.html y ahora funciona.
fuente
Bueno, a veces vale la pena verificar si anuló las asignaciones globales por algún controlador de descanso. Ejemplo de error simple (kotlin):
En el caso anterior, obtendrá cuando solicite recursos estáticos:
La razón podría ser que deseaba asignar
@PostMapping
un mapa/foo
pero olvidarse de la@RequestMapping
anotación en el@RestController
nivel. En este caso, todas las solicitudes se asignanPOST
y no recibirá contenido estático en este caso.fuente
Dados recursos en src / main / resources / static, si agrega este código, todo el contenido estático de src / main / resources / static estará disponible en "/":
fuente
En mi caso, algunos archivos estáticos no fueron servidos, como las fuentes .woff y algunas imágenes. Pero css y js funcionaron bien.
Actualización: una solución mucho mejor para hacer que Spring Boot sirva las fuentes de woff correctamente es configurar el filtrado de recursos mencionado en esta respuesta, por ejemplo (tenga en cuenta que necesita incluir y excluir):
----- Solución anterior (funciona pero dañará algunas fuentes) -----
Otra solución fue deshabilitar la coincidencia de patrón de sufijo con
setUseSuffixPatternMatch(false)
Créditos: ¡@Abhiji me señaló con 4. en la dirección correcta!
fuente
Las solicitudes a / ** se evalúan en ubicaciones estáticas configuradas en resourceProperties .
agregar lo siguiente en application.properties, podría ser lo único que debe hacer ...
esto sobrescribirá las ubicaciones estáticas predeterminadas, que es:
Es posible que no desee hacer eso y solo asegúrese de que sus recursos terminen en una de esas carpetas predeterminadas.
Realización de una solicitud: si tuviera el archivo example.html almacenado en /public/example.html, entonces puedo acceder de esta manera:
Si quisiera otra uri como
<host>/<context-path>/magico/*
para los archivos en classpath: / magicofiles / * necesitas un poco más de configuraciónfuente
Como se dijo anteriormente, el archivo debe estar en
$ClassPath/static/images/name.png
(/ static o / public o / resources o / META-INF / resources). Este $ ClassPath significamain/resources
omain/java
dir.Si sus archivos no están en directorios estándar, puede agregar la siguiente configuración:
}
fuente