[spring] 정적 컨텐츠를 제공하지 않는 Spring Boot

정적 컨텐츠를 제공하기 위해 Spring-boot 프로젝트를 가져올 수 없습니다.

나는라는 폴더에 배치 한 static아래를 src/main/resources. 그 안에는라는 폴더가 images있습니다. 앱을 패키지하고 실행하면 해당 폴더에 넣은 이미지를 찾을 수 없습니다.

나는에 정적 파일을 넣어 시도했습니다 public, resources그리고 META-INF/resources아무것도 작동하지 않습니다.

나는 항아리 경우 -tvf 내가 파일을 오른쪽 폴더에있는 항아리 안에있는 것을 볼 수 있습니다 app.jar :
/static/images/head.png예를 들어,하지만 전화 : http://localhost:8080/images/head.png모든 I get 및이있다404

spring-boot가 이것을 찾지 못하는 이유가 있습니까? (1.1.4 BTW를 사용하고 있습니다)



답변

1 년 넘게 죽은자를 키우지 말고 이전의 모든 대답에는 몇 가지 중요한 점이 빠져 있습니다.

  1. @EnableWebMvc수업에서 사용 중지 org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration됩니다. 완전한 제어를 원한다면 괜찮지 만 그렇지 않으면 문제입니다.
  2. 이미 제공된 것 외에도 정적 리소스를위한 다른 위치를 추가하기 위해 코드를 작성할 필요가 없습니다. org.springframework.boot.autoconfigure.web.ResourcePropertiesv1.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;
  3. 앞에서 언급했듯이 요청 URL은 이러한 위치와 관련 하여 해결 됩니다. 따라서 src/main/resources/static/index.html요청 URL이 인 경우 게재됩니다 /index.html. Spring 4.1부터 경로 해결을 담당하는 클래스는 org.springframework.web.servlet.resource.PathResourceResolver입니다.

  4. 접미사 패턴 일치는 기본적으로 활성화되어 있으며 이는 요청 URL을 의미합니다. /index.htmlSpring은 해당 처리기를 찾습니다 /index.html. 정적 콘텐츠를 제공하려는 경우에 문제가됩니다. 이를 비활성화하려면 다음과 같이 확장하고 WebMvcConfigurerAdapter(사용하지 마십시오 @EnableWebMvc) 재정의하십시오 configurePathMatch.

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }

IMHO, 코드에서 버그를 줄이는 유일한 방법은 가능할 때마다 코드를 작성하지 않는 것입니다. 이미 제공된 것을 사용하십시오. 조사가 필요하더라도 그만한 가치가 있습니다.


답변

스프링 부트 상태와 달리 스프링 부트 항아리가 컨텐츠를 제공하도록하려면이 구성 클래스를 통해 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{
}

정적 콘텐츠를 제공하기 위해 다른 코드가 필요하지 않았지만 publicunder 이라는 디렉토리를 넣고 src/main/webappmaven을 src/main/webapp리소스 디렉토리로 가리 키도록 구성했습니다 . 이것은 public에 복사되어 target/classesspring-boot / tomcat을 찾기 위해 런타임에 클래스 경로에 있음을 의미합니다 .


답변

“/”에 매핑되었거나 경로가 매핑되지 않은 컨트롤러를 찾습니다.

나는 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다음 URL을 사용하여 이미지에 액세스 할 수 있습니다 http://localhost:8080/images/image.jpg(서버가 포트 8080에서 시작되고 응용 프로그램이 루트 컨텍스트로 배포 됨).


답변

Spring Boot 참조 문서 를 확인 했습니까 ?

기본적으로 Spring Boot는 클래스 경로의 /static( /public또는 /resources또는 /META-INF/resources) 폴더 또는 ServletContext의 루트에서 정적 컨텐츠를 제공합니다 .

프로젝트를 Spring MVC로 웹 컨텐츠 제공 안내서와 비교 하거나 spring-boot-sample-web-ui 프로젝트 의 소스 코드를 확인할 수도 있습니다.


답변

나는이 정확한 문제를 겪고 있었고 application.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로 파일을 제공했습니다.

위의 어느 것도 나를 위해 효과가 없었습니다. 왜냐하면 아무도 다른 목적을 위해 온라인에서 쉽게 복사 할 수있는이 작은 재산을 언급하지 않았기 때문입니다.

그것이 도움이되기를 바랍니다! 이 문제가있는 사람들을위한이 긴 답변 게시물에 잘 맞을 것이라고 생각했습니다.