No puedo hacer que mi proyecto Spring-boot sirva contenido estático.
He colocado una carpeta nombrada staticdebajo 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, resourcesy META-INF/resourcespero nada funciona.
Si jar -tvf app.jar puedo ver que los archivos están dentro del jar en la carpeta correcta:
/static/images/head.pngpor ejemplo, pero llamando:, http://localhost:8080/images/head.pngtodo 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:
@EnableWebMvcen 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.ResourcePropertiesdesde v1.3.0.RELEASE, veo un campostaticLocationsque 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.htmllo 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 anuleconfigurePathMatchcomo 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
publicdebajosrc/main/webappy configuré a maven para que señalarasrc/main/webappcomo un directorio de recursos. Esto significa quepublicse copiatarget/classesy, 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
@RestControllercontrolador anotado que olvidé anotar con una@RequestMappinganotació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
WebMvcConfigpuede anular eladdResourceHandlersmé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,/resourcesy/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/imagesnombre,image.jpgpor 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
@EnableWebMvcyWebMvcAutoConfigurationAdapter. 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:staticen mi application.properties, pero no funcionó para mí. Estoy usando@EnableWebMvcen mi clase de configuración.security.ignoredysecurity.publicPathsCreo 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
@EnableWebMvcque evitará que seWebMvcAutoConfigurationcargue, que es el código responsable de crear los manejadores de recursos estáticos. Hay otras condiciones que evitarán que seWebMvcAutoConfigurationcargue 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
WebMvcConfigurationSupportcual 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
packageobjetivo que se ejecutará antes de que la aplicación se inicie realmente. (Idea:RunMenú,Edit Configrations...,Add, y seleccionarRun Maven Goaly especificar elpackageobjetivo 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
@PostMappingun mapa/foopero olvidarse de la@RequestMappinganotación en el@RestControllernivel. En este caso, todas las solicitudes se asignanPOSTy 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/resourcesomain/javadir.Si sus archivos no están en directorios estándar, puede agregar la siguiente configuración:
}
fuente