스프링 부트가 정적 콘텐츠를 제공하지 않음
스프링 부트 프로젝트에서 정적 컨텐츠를 처리할 수 없습니다.
가 폴더 음 i i i다 named named named named 。static
아래src/main/resources
그에 named 라는 폴더가 .images
. 해당 를 찾을 수 앱을 패키징하여 실행해도 해당 폴더에 저장한 이미지를 찾을 수 없습니다.
에 넣으려고 했습니다.public
,resources
★★★★★★★★★★★★★★★★★」META-INF/resources
아무 것도 안 돼.
app.를 jar로 을 알 수 .tvf app.jar jar 로f if 、 tvf app . jar 。/static/images/head.png
: "" " " " " "」http://localhost:8080/images/head.png
「 」 「 」 「 」 「 」 되지 않습니다.404
스프링 부트에서 이 기능을 찾을 수 없는 이유를 알고 계십니까? (저는 1.1.4 BTW를 사용하고 있습니다.)
1년 이상 지난 후 사망자를 되살리지는 않았지만, 이전의 모든 답변들은 몇 가지 중요한 점을 놓치고 있습니다.
@EnableWebMvc
에서 "Disable"이 됩니다.org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
완전한 제어를 원하시면 됩니다만, 그렇지 않으면 문제가 됩니다.이미 제공된 것 외에 정적 리소스의 다른 위치를 추가하기 위해 코드를 작성할 필요가 없습니다. 있습니다.
org.springframework.boot.autoconfigure.web.ResourceProperties
.3v1.3.0에서.RELEASE가 표시됩니다.staticLocations
할 수 .application.properties
하다/** * Locations of static resources. Defaults to classpath:[/META-INF/resources/, * /resources/, /static/, /public/] plus context:/ (the root of the servlet context). */ private String[] staticLocations = RESOURCE_LOCATIONS;
앞서 설명한 바와 같이 요청 URL은 이러한 위치를 기준으로 해결됩니다.따라서
src/main/resources/static/index.html
URL이 "URL"일 때 됩니다./index.html
4.1는 Spring 4.1입니다.org.springframework.web.servlet.resource.PathResourceResolver
.의 매칭은 하게 되어 즉, 요구 URL 에 , 「」, 「URL」이 유효하게 되어 있습니다.
/index.html
에는 에/index.html
스태틱 콘텐츠를 제공하는 경우 이 문제가 발생합니다.로 하려면 , 「」를 합니다.WebMvcConfigurerAdapter
(하지 마십시오)@EnableWebMvc
를 덮어씁니다.configurePathMatch
다음과 같이 합니다.@Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); }
IMHO, 코드에 버그가 적은 유일한 방법은 가능한 한 코드를 쓰지 않는 것입니다.이미 제공된 것을 사용하세요. 비록 그것이 약간의 연구가 필요하더라도, 수익은 그만한 가치가 있습니다.
2021년 7월 편집:
WebMvcConfigurerAdapter
는 봄되었습니다.WebMvcConfigurer
및 주석을 붙입니다.@Configuration
.
spring-boot에 기재되어 있는 내용과 달리 spring-boot jar가 콘텐츠를 제공하도록 하려면 다음 절차를 따릅니다.이 설정 클래스를 통해 특별히 src/main/resources/static 콘텐츠를 등록해야 했습니다.
@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
}
}
도 같은, 하는 것이었습니다.심플한 해결책은 구성 클래스를 확장하는 것이었습니다.WebMvcAutoConfiguration
:
@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}
하기 위해 는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★,public
아래src/main/webapp
를 포인트 을 설정했습니다.src/main/webapp
이치노, ,,public
복사되어 있습니다.target/classes
spring-boot/flash 를 、 spring-boot/flash 、 spring-boot/flash 。
"/"에 매핑되거나 경로가 매핑되지 않은 컨트롤러를 찾습니다.
405개의 오류가 나는 이런 문제가 있었고 며칠 동안 머리를 세게 부딪쳤다.는 「 「 」로 판명되었습니다.@RestController
입니다.@RequestMapping
가 "/"로 설정되고 리소스 매핑을 한 것 .이 매핑된 경로는 기본적으로 "/"로 설정되며 정적 콘텐츠 리소스 매핑을 차단합니다.
다음과 같이 설정할 수 있습니다.
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {
// specific project configuration
}
서 한 것은 의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.WebMvcConfig
덮어쓸 수 있다addResourceHandlers
를 명시적으로 호출해야 .super.addResourceHandlers(registry)
(기본 리소스 위치에 만족하면 메서드를 재정의할 필요가 없습니다).
은, 위치리소스 로케이션」)입니다./static
,/public
,/resources
★★★★★★★★★★★★★★★★★」/META-INF/resources
는) 핸들러가 아직 않은 됩니다./**
.
지금 이 순간부터, 만약 당신이 이미지를 가지고 있다면src/main/resources/static/images
'''image.jpg
다음의 를 할 수 .http://localhost:8080/images/image.jpg
(서버가 포트 8080으로 기동해, 애플리케이션이 루트 컨텍스트에 전개되는 것).
이 문제를 안고 있다가 어플리케이션.properties에 정의되어 있는 것을 깨달았습니다.
spring.resources.static-locations=file:/var/www/static
내가 시도했던 다른 모든 것들보다 우선시 되는 거였어.저 같은 경우에는 둘 다 갖고 싶었기 때문에 소유지를 유지하고 다음과 같이 덧붙였습니다.
spring.resources.static-locations=file:/var/www/static,classpath:static
src/main/resources/static 파일을 localhost:{port}/file.html로 처리했습니다.
온라인에서 쉽게 복사할 수 있는 이 작은 재산에 대해 아무도 언급하지 않았기 때문에 위의 어느 것도 나에게 효과가 없었습니다.
도움이 됐으면 좋겠다!이 문제를 안고 있는 분들을 위한 이 긴 답변 포스트에 잘 어울릴 것 같아서요.
Spring Boot 레퍼런스 문서를 확인했습니까?
은 "Spring Boot"라는 합니다.
/static
(오류)/public
★★★★★★★★★★★★★★★★★」/resources
★★★★★★★★★★★★★★★★★」/META-INF/resources
servletContext의
또한 프로젝트를 Spring MVC에서 웹 콘텐츠를 제공하는 가이드와 비교하거나 spring-boot-sample-web-ui 프로젝트의 소스 코드를 확인할 수 있습니다.
저는 앞의 답변들이 주제를 잘 다루고 있다고 생각합니다.단, 어플리케이션에서 Spring Security를 유효하게 하고 있는 경우에는 "/static/fonts"와 같은 다른 정적 자원 디렉토리에 대한 요청을 허용하도록 Spring에 구체적으로 지시해야 할 수도 있습니다.
이 경우 디폴트로는 "/static/css", "/static/js", "/static/images"가 허용되어 있습니다만, /static/fonts/**는 Spring Security 구현에 의해 차단되었습니다.
다음은 이 문제를 해결한 예입니다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.....
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/", "/fonts/**").permitAll().
//other security configuration rules
}
.....
}
오래된 질문에 대한 또 다른 답을 덧붙이자면...사람들이 언급하고 있는 것은@EnableWebMvc
방지하다WebMvcAutoConfiguration
loading - 핸들러를 입니다.from loading - 로딩 - 로딩 - 로딩으로 리소스 핸들러를 만듭니다.에도 하다를 조건이 있습니다.WebMvcAutoConfiguration
을 사용하다가장 명확하게 알 수 있는 방법은 소스를 확인하는 것입니다.
했는데, 은 제, 는, 는, 서, 서, 서, 서, 서, 서, 서, in, in, in, in, in, in, in, in, in, in, in, in, in, in, in, in, in, in, in, from, from, from, from, from, from from, , ,WebMvcConfigurationSupport
은 자동입니다.즉, 자동 설정을 방해하는 조건입니다.
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
절대 연장하지 않는 것이 중요합니다.WebMvcConfigurationSupport
대신, 에서 확장합니다.WebMvcConfigurerAdapter
.
업데이트: 5.x에서 이를 수행하려면 WebMvcConfigurer를 구현해야 합니다.
이 솔루션은 다음과 같이 기능합니다.
먼저 다음과 같이 webapp/WEB-INF 아래에 리소스 폴더를 배치합니다.
-- src
-- main
-- webapp
-- WEB-INF
-- resources
-- css
-- image
-- js
-- ...
두 번째, 스프링 구성 파일
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resource/**").addResourceLocations("WEB-INF/resources/");
}
}
그런 다음 http://localhost:8080/resource/image/yourimage.jpg와 같은 리소스 컨텐츠에 액세스할 수 있습니다.
다음 디렉토리 아래에 정적 리소스를 배치합니다.
/src/main/resources/static
application.properties 파일에 이 속성을 추가합니다.
server.servlet.context-path=/pdx
http://localhost:8080/pdx/images/image.jpg 에서 액세스 할 수 있습니다.
고려해야 할 것은 2가지입니다(스프링 부트 v1.5.2).RELEASE)- 1) 모든 컨트롤러 클래스에서 @EnableWebMvc 주석을 확인하고 2) 주석을 사용하는 컨트롤러 클래스를 확인합니다(@RestController 또는 @Controller).한 클래스에 Rest API와 MVC 동작을 혼재시키지 마십시오.MVC의 경우 @Controller를 사용하고 REST API의 경우 @RestController를 사용합니다.
위의 두 가지를 하면 문제가 해결되었습니다.현재 스프링 부트에서는 아무런 문제가 없는 정적 리소스가 로드되고 있습니다.@Controller => load index.dload => 정적 파일을 로드합니다.
@Controller
public class WelcomeController {
// inject via application.properties
@Value("${welcome.message:Hello}")
private String message = "Hello World";
@RequestMapping("/")
public String home(Map<String, Object> model) {
model.put("message", this.message);
return "index";
}
}
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>
<!-- The app's logic -->
<script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
<script type="text/javascript">
require.config({
paths: { text:"/webapp/libs/text" }
});
</script>
<!-- Development only -->
<script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>
</head>
<body>
</body>
</html>
Spring Boot 2.2를 사용하고 있는데 정적 콘텐츠가 전혀 표시되지 않습니다.나는 나에게 효과가 있는 두 가지 솔루션을 발견했다.
옵션 #1 - 주석 사용 중지 이 주석에서는 다음과 같이 일반적으로 사용되는 위치에서 정적 컨텐츠를 자동으로 처리하는 부분을 포함하여 일부 자동 구성을 비활성화합니다./src/main/resources/static
하지 않은@EnableWebMvc
그냥 해 주세요.@Configuration
를 누릅니다
2 - 실장 2 - 실장WebMvcConfigurer
안에서@EnableWebMvc
및 구현addResourceHandlers()
하다
@EnableWebMvc
@Configuration
public class SpringMVCConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
registry.addResourceHandler("/vendor/**").addResourceLocations("classpath:/static/vendor/");
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
}
이제 코드가 모든 정적 리소스 경로를 관리합니다.
이클립스 또는 IntelliJ Idea에서 어플리케이션을 실행하고 Maven을 사용할 때 문제가 표면화되는 경우 해결의 열쇠는 Spring-boot Getting Started 문서에 있습니다.
Maven을 사용하는 경우 다음을 수행합니다.
mvn package && java -jar target/gs-spring-boot-0.1.0.jar
여기서 중요한 것은 애플리케이션을 실제로 시작하기 전에 실행할 목표를 추가하는 것입니다.(아이디어:Run
▲▲▲▲▲▲▲▲▲▼,Edit Configrations...
,Add
, , , , , 을 합니다.Run Maven Goal
을 해 주세요.package
★★★★★★★★★★★★★★★★★★★」
스프링 부트 2.1.3에서도 리소스가 404를 찾을 수 없다는 동일한 문제가 발생하였습니다.application.properties에서 아래를 삭제했습니다.
#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,
@enable WebMVC를 삭제하고 WebMvcConfigurer 덮어쓰기를 삭제했습니다.
//@Enable WebMvc
또, @Enable 이 있는 것을 확인합니다.[ Auto Configuration ]를 선택합니다.
그리고 모든 정적 리소스를 src/main/resources/static에 투입하면 마법처럼 작동합니다.
저는 1.3.5를 사용하고 있으며 Jersey 구현을 통해 REST 서비스를 다수 호스팅하고 있습니다.HTML + js 파일을 몇 개 추가할 때까지 정상적으로 동작했습니다.이 포럼에서 나온 답변 중 어느 것도 도움이 되지 않았다.그러나 pom.xml에 다음 종속성을 추가하자 src/main/resources/static의 모든 콘텐츠가 브라우저를 통해 표시되었습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<dependency>
spring-web/spring-webmvc는 spring boot auto config를 유효하게 하는 중요한 전이 의존관계인 것 같습니다.
참고로 이렇게 불량한 레스트 컨트롤러를 추가하면 완벽하게 동작하는 스프링 부트 앱을 망쳐서 정적 폴더의 콘텐츠를 제공하지 못하게 할 수도 있습니다.
@RestController
public class BadController {
@RequestMapping(method= RequestMethod.POST)
public String someMethod(@RequestParam(value="date", required=false)String dateString, Model model){
return "foo";
}
}
이 예에서는 프로젝트에 불량 컨트롤러를 추가한 후 브라우저가 정적 폴더에서 사용할 수 있는 파일을 요청하면 오류 응답이 '405 Method Not Allowed'입니다.
부정한 컨트롤러의 예에서는 알림 경로가 매핑되지 않습니다.
boot 2를 하여 루트 '''2''에.*를 사용하여 루트에 매핑하는 컨트롤러가 있습니다.GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
그리고 내 앱이 리소스 서비스를 중지합니다.
이러한 루트를 사용하는 것은 바람직하지 않다는 것을 알지만, 모든 것은 당신이 만들고 있는 앱에 달려 있습니다(나의 경우, 그러한 루트를 가질 수밖에 없습니다).
내 앱이 리소스를 다시 제공하는지 확인하기 위한 해킹입니다.은 변수가보다 먼저 에 에 매핑하는 메서드를 추가하기로 ./imgaes/{name}
다른 반복됩니다.
@GetMapping(value = "/images/{image}", produces = {MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
public @ResponseBody
byte[] getImage(@PathVariable String image) {
ClassPathResource file = new ClassPathResource("static/images/" + image);
byte[] bytes;
try {
bytes = StreamUtils.copyToByteArray(file.getInputStream());
} catch (IOException e) {
throw new ResourceNotFoundException("file not found: " + image);
}
return bytes;
}
그리고 이것이 나의 문제를 해결했다.
/**에 대한 요청은 resourceProperties에서 구성된 정적 위치에 대해 평가됩니다.
application.properties에 다음을 추가하는 것만으로 충분할 수 있습니다.
spring.resources.static-locations=classpath:/myresources/
다음과 같은 기본 정적 위치를 덮어씁니다.
ResourceProperties.CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
이 작업을 수행하지 않고 리소스가 이러한 기본 폴더 중 하나에 있는지 확인하는 것이 좋습니다.
요청 수행:example.html이 /public/example.html에 저장되어 있으면 다음과 같이 액세스 할 수 있습니다.
<host>/<context-path?if you have one>/example.html
uri uri uri uri 같은 다른 를 원할 경우<host>/<context-path>/magico/*
configclasspath:/classofiles/*가 더 합니다.
@Configuration
class MyConfigClass implements WebMvcConfigurer
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}
제 경우 스프링과 잭스를 혼합한 스프링 부츠 어플리케이션이 있습니다. 저는 클래스에서 .org.glassfish.jersey.server.ResourceConfig
되도록 이 을 해당 property(ServletProperties.FILTER_FORWARD_ON_404, true)
.
그래들하고 일식을 사용해서 몇 시간이고 알아내려고 노력했어요
코딩은 필요 없습니다.메뉴 옵션 [New]-> [ Source Folder (NOT New -> Folder)]를 사용하여 src / main / resources ]아래에 스태틱폴더를 작성해야 합니다.이것이 동작하는 이유를 알 수 없지만, 새로운 -> 소스 폴더를 실행한 후 폴더 이름을 static(static)으로 지정했습니다(source folder 대화상자에 체크해야 할 오류가 나타납니다: 다른 소스 폴더의 제외 필터를 업데이트하여 네스팅을 해결합니다).index.html을 추가한 새로운 정적 폴더는 이제 작동합니다.
글로벌 매핑을 다른 컨트롤러에 의해 덮어쓰지 않았는지 확인할 필요가 있습니다.단순한 실수 예(kotlin):
@RestController("/foo")
class TrainingController {
@PostMapping
fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto
}
위의 경우 스태틱리소스를 요구할 때 다음과 같이 표시됩니다.
{
title: "Method Not Allowed",
status: 405,
detail: "Request method 'GET' not supported",
path: "/index.html"
}
는 맵을 싶었기 일 수 .@PostMapping
로로 합니다./foo
잊 about about는 잊어라@RequestMapping
의 @RestController
이은 level로 .POST
이 경우 정적 콘텐츠를 수신하지 않습니다.
이 코드를 추가하면 src/main/resources/static 아래의 리소스가 지정되면 src/main/resources/static의 모든 정적 콘텐츠를 "/:
@Configuration
public class StaticResourcesConfigurer implements WebMvcConfigurer {
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/");
}
}
제 경우 .woff 글꼴이나 이미지 같은 정적 파일이 제공되지 않았습니다.하지만 css와 js는 잘 작동했다.
업데이트: Spring Boot에서 woff 글꼴을 올바르게 처리하려면 다음 답변에서 설명한 리소스 필터링을 설정하는 것이 좋습니다(포함 및 제외 모두 필요).
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>static/aui/fonts/**</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>static/aui/fonts/**</include>
</includes>
</resource>
</resources>
----- 오래된 솔루션(동작하지만 일부 글꼴이 파손됨) -----
다른 매칭을 하지 않도록 이었습니다.setUseSuffixPatternMatch(false)
@Configuration
public class StaticResourceConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// disable suffix matching to serve .woff, images, etc.
configurer.setUseSuffixPatternMatch(false);
}
}
크레딧 : @Abhiji가 4로 나를 가리켰어. 올바른 방향으로!
Thymeleaf에서 작동하며 스타일시트를 링크할 수 있습니다.
<link th:href="@{/css/style.css}" rel="stylesheet" />
한 바와 같이 은 위위서음음음음음음음음음음음음음음음음음음음 as as as as 에 있어야 합니다.$ClassPath/static/images/name.png
(/ 또는 또는 또는 /META-INF), (/static " /public " /resources " /META-INFresources") $"$ClassPath"를 의미합니다.main/resources
★★★★★★★★★★★★★★★★★」main/java
dir.closs.dir.dir.clos
파일이 표준 dir 에 없는 경우는, 다음의 설정을 추가할 수 있습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/lib/**"); // like this
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// ... etc.
}
...
}
언급URL : https://stackoverflow.com/questions/24661289/spring-boot-not-serving-static-content
'programing' 카테고리의 다른 글
각도 2 요소 표시 및 숨기기 (0) | 2023.03.26 |
---|---|
클래스를 통해 추가된 작업을 제거하는 방법 (0) | 2023.03.26 |
데이터를 포함하는 표의 열 크기를 변경하다 (0) | 2023.03.26 |
데이터 프레임을 JSON으로 변환 (0) | 2023.03.21 |
angular.element에서 raw DOM 요소를 가져오는 방법이 있습니까? (0) | 2023.03.21 |