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


173

정적 컨텐츠를 제공하기 위해 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를 사용하고 있습니다)


6
기본 리소스 처리는 / **에 매핑됩니다. 활성화되어 있는지 다시 확인하고 싶습니다. 그렇다면 앱을 시작할 때 출력에 "[class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 유형의 핸들러에 매핑 된 URL 경로 [/ **]"로 끝나는 행이 표시됩니다. 또 다른 가능성은 / **에 매핑되고 리소스 처리기보다 우선하는 자체 컨트롤러입니다. 앱 시작 결과를 게시하면 상황을 쉽게 확인할 수 있습니다.
Andy Wilkinson

12
나는 당신이 @EnableWebMvc당신의 응용 프로그램에 (또는 동등한) 있다고 생각합니다 . 기본 Boot MVC 구성이 해제됩니다.
Dave Syer

1
아니요, @EnableWebMvc가 없습니다. 나는 이것을 얻지 못한다. 이제 템플릿에서도 발생합니다. 내 템플릿 (프리 마커)은 스프링 부트의 클래스 로더에서 발견됩니다.
Vinicius Carvalho

2
비슷한 문제가 발생하여 권장되는 해결책 중 하나도 운이 없었습니다. 누군가가 너무 친절하게보고 내가 잘못하고있는 것을 정확히 지적 할 수 있다면 그것은 대단히 감사하겠습니다! github.com/kylebober/kbss
Kyle S. Bober

3
src / main / resources / public / style.css 파일이 있으면 예상대로 /public/style.css가 아닌 /style.css라는 URL이 발견되었습니다.
Dave

답변:


179

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


3
이 답변은 실제로 많은 연구를 거친 후입니다. 읽을만한 위대한 것
Ekansh Rastogi

2
내가 중추적 이었다면 나는이 답변을 받아 Spring Boot 문서에 넣을 것이다
aliopi

2
@Abhijit Sarkar 나는 회사 Pivotal을 의미했습니다. 나쁜 감정에 대해 죄송하지만 의도하지 않았습니다. 내가 올바른 경우 Pivotal은 Spring의 소유자입니다. 나는 그것을 문서화 할 수는 있지만, 그들은 돈을받는 사람들이 있으므로 그렇게해야합니다 : P
aliopi

1
@aliopi Spring은 오픈 소스 프로젝트입니다.
Abhijit Sarkar

3
코드에서 버그를 줄이는 유일한 방법은 코드를 작성하지 않는 것입니다.
Clijsters

78

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

3
저도 같은 문제, 봄 부팅의 동일한 버전을 가지고 있지만이 역시 나를 위해 작동하지 않았다
greyfox

버전 1.2.5에서 내 문제가 해결되었습니다! 정말 고마워요. 투표 해주세요 !!
mrclrchtr

이 핵은 작동합니다 ... 자동 구성이 실패한 것이 이상합니다
Allan Vital

유감스럽게도,이 해킹은 저에게 효과적이지 않습니다. 근본 원인이 리소스의 경로인지 확실하지 않습니다. 아마도 Windows에서 실행하기 때문에 다르게 포맷해야합니까?
acarlstein

50

비슷한 문제가 있었고 간단한 해결책은 구성 클래스를 확장하는 것이 었습니다 WebMvcAutoConfiguration.

@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}

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


이 방법으로 정적 자원이 다른 프로파일에서 작동하지 않습니다. 예를 들어 다른 IP 주소를 사용하는 릴리스 용 프로파일이 있습니다. 모든 리소스에 대해 404 오류가 발생합니다.
Mahdi

24

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

나는 405 오류가 발생하여 이와 같은 문제가 있었고 며칠 동안 머리를 세게 부딪쳤다. 문제는 @RestController주석이 달린 주석을 잊어 버린 주석이 달린 컨트롤러 @RequestMapping였습니다. 이 매핑 경로의 기본값은 "/"이고 정적 콘텐츠 리소스 매핑이 차단 된 것 같습니다.


1
나를 위해 해결했습니다! @RestController ( "/ blubb")로 주석이 달린 컨트롤러가 분명히 잘못되었지만 때로는 나무의 나무가 보이지 않습니다. @RestController @RequestMapping ( "/ blubb")로 변경하면 해결되었습니다.
krinklesaurus

"모든 나무의 숲을 볼 수 없습니다"라는 표현이 독일어와 스웨덴어로 존재한다는 생각에 기뻤습니다.
Johannes

2
정적 콘텐츠를 제공하고 루트 요청에 대한 동적 처리기를 사용하려는 경우 @RequestMapping ( "/")을 명시 적으로 추가 할 수도 있습니다.
mjj1409

1
와우 ....이 일에 2 일을 낭비했습니다. 내 스프링 부트 mvc 응용 프로그램은 스프링 보안을 사용하고 styles.css 파일을 보지 못했습니다. 보안 상 .jsp가 styles.css 파일에 액세스하는 것을 허용하지 않았다고 생각합니다. 컨트롤러에 @RequestMapping ({ "", "/", "/ home"})이있었습니다. ""와 "/"를 내 MVC가 완벽하게 작동하기 시작했습니다.
skmansfield

3
@Shafiul 아니요 EnableAutoConfiguration과 SpringBootApplication을 모두 추가하는 것은 불필요합니다! "@SpringBootApplication"에는 "@EnableAutoConfiguration"이 포함되어 있습니다.
Dehan de Croos

19

다음과 같이 구성 할 수 있습니다.

@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에서 시작되고 응용 프로그램이 루트 컨텍스트로 배포 됨).


addResourceHandlers를 / can / 재정의하더라도 OP의 문제를 해결하기 위해 실제로는 필요하지 않다고 언급하는 것이 중요합니다.
소프트웨어 엔지니어

@EngineerDollery 의견에 감사드립니다. 제 의도 였지만 설명을 명시 적으로 추가했습니다
Francisco Spaeth

css / js를 src / main / resources / static 폴더로 옮겼는데 더 이상 오류가 없지만 여전히 CSS를 내 페이지에 표시 할 수 없습니다.
Hatem Jaber

야, 나는이 작업 솔루션을 찾기 위해 인터넷의 깊이를 여행했다. 이 키의 조합이었다 보인다 @EnableWebMvcWebMvcAutoConfigurationAdapter. 큰 시간 감사합니다!
Ian Newland

그것은 나를 위해 상자 밖으로 작동하지 않았다. 이것도 추가해야했습니다. 두 가지 문제가 있었으므로 여기에 내 의견을 추가하십시오. 또한 @Johannes가 언급 한대로 "/"를 매핑하는 컨트롤러가 있습니다. 이렇게하고 "/"컨트롤러를 제거하면 문제가 해결되었습니다.
loyalBrown

11

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

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

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


2
그렇습니다. 문서에서 지시 한대로 시도한 장소입니다. 그러나 아무것도 작동하지 않습니다. 왜 자원이 전혀 없는지 모르겠습니다. 샘플을 살펴 보았습니다. 이상히 문서에서 제안한 구조를 사용하는 샘플이 없습니다. 방금 붙여 넣은 템플릿 폴더를 사용합니다 .thymeleaf 구성 또는 속도라고 가정합니다.
Vinicius Carvalho

웹 UI 샘플 ( github.com/spring-projects/spring-boot/tree/v1.1.3.RELEASE/… )은 정적 컨텐츠를 제공합니다.
Andy Wilkinson

@ViniciusCarvalho에 동의합니다. 가능한 모든 조합을 시도하여 CSS / JS를 올바른 위치에 가져 왔지만 그렇게 할 수 없습니다. localhost : 8089 / css / styles.css를 방문해도 아무것도 표시되지 않습니다. 바디 색상을 변경하는 규칙은 하나뿐입니다.
Hatem Jaber

10

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

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

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


Spring Boot 2.0.5.RELEASE를 사용하고 application.properties를 넣었 spring.resources.static-locations=file:/var/www/static,classpath:static지만 작동하지 않습니다. @EnableWebMvc구성 클래스를 사용 하고 있습니다.
N. Ngo

이것이 내 문제를 해결 한 것입니다. 따라와 security.ignoredsecurity.publicPaths
JoSSte

5

이전 답변이 주제를 잘 다루고 있다고 생각합니다. 그러나 어떤 경우에는 애플리케이션에서 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
    }
.....
}

5

이전 질문에 대한 또 다른 대답을 추가하기 위해 ... 사람들은 정적 리소스 핸들러를 만드는 코드 인로드 @EnableWebMvc방지 WebMvcAutoConfiguration를 언급했습니다 . WebMvcAutoConfiguration로딩을 방해하는 다른 조건들 도 있습니다. 이것을 보는 가장 명확한 방법은 소스를 보는 것입니다.

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

내 경우에는 확장 된 클래스가있는 라이브러리가 포함되어 WebMvcConfigurationSupport있어 자동 구성을 방해하는 조건입니다.

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

에서 확장 하지 않는 것이 중요합니다 WebMvcConfigurationSupport. 대신에서 확장하십시오 WebMvcConfigurerAdapter.

업데이트 : 5.x 에서이 작업을 수행하는 올바른 방법은 WebMvcConfigurer를 구현하는 것입니다.


WebMvcConfigurerAdapter는 Spring Boot 5.0부터 사용되지 않습니다. 인터넷 검색을 통해 해당 클래스의 Javadocs에서이를 확인할 수 있습니다. "5.0에서 WebMvcConfigurer에는 기본 메소드 (Java 8 기준선으로 가능)가 있으며이 어댑터없이 직접 구현할 수 있습니다." 그래서 지금 WebMvcConfigurer를 구현 한다고 생각 합니다.
Marvo

@Marvo는 정확히 맞습니다. 5.x에서이를 수행하는 올바른 방법은을 구현하는 것 WebMvcConfigurer입니다.
Bal

4

이 솔루션은 저에게 효과적입니다.

먼저, 다음 구조에 따라 resources 폴더를 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 와 같은 리소스 내용에 액세스 할 수 있습니다 .


3

고려해야 할 두 가지가 있습니다 (Spring Boot v1.5.2.RELEASE)-1) @EnableWebMvc 주석에 대한 모든 컨트롤러 클래스를 확인하고 존재하는 경우 제거하십시오 2) 주석이 사용되는 컨트롤러 클래스를 확인하십시오-@RestController 또는 @Controller . 하나의 클래스에서 Rest API와 MVC 동작을 혼합하지 마십시오. MVC의 경우 @Controller를 사용하고 REST API의 경우 @RestController를 사용하십시오.

위의 두 가지 작업을 수행하면 문제가 해결되었습니다. 이제 스프링 부트는 문제없이 정적 리소스를로드합니다. @Controller => load index.html => 정적 파일을로드합니다.

@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>

@EnableWebMvc를 제거하면 나를 위해했습니다! 감사합니다
turboemu

3

정적 자원 을 디렉토리 아래에 두십시오 .

/src/main/resources/static

application.properties 파일에이 속성을 추가하십시오

server.servlet.context-path=/pdx

http : // localhost : 8080 / pdx / images / image.jpg 에서 액세스 할 수 있습니다

여기에 이미지 설명을 입력하십시오


1
나는 말을 해야할지 모르겠 감사합니다 당신을. 형님 잘 하시네요 위의 거의 모든 솔루션을 시도했지만 이것이 가장 좋고 가장 짧습니다.
user12061795

2

IDE 내에서 (예 : Eclipse 또는 IntelliJ Idea에서 시작) 응용 프로그램을 시작하고 Maven을 사용할 때 문제가 발생하는 경우 솔루션의 핵심은 Spring-boot Getting Started 문서에 있습니다.

Maven을 사용하는 경우 다음을 실행하십시오.

mvn package && java -jar target/gs-spring-boot-0.1.0.jar

중요한 부분은 package응용 프로그램이 실제로 시작되기 전에 실행할 목표를 추가하는 것입니다. (아이디어 : Run메뉴, Edit Configrations..., Add, 거기에 선택 Run Maven Goal하고 지정 package분야에서 목표를)


1

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는 스프링 부트 자동 구성을 켜는 중요한 전이 의존성 인 것 같습니다.


1

참고 : 또한 제대로 작동하지 않는 스프링 부트 응용 프로그램을 엉망으로 만들면 정적 폴더의 내용을 제공하지 못하게됩니다.

 @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 '입니다.

통지 경로는 잘못된 제어기 예제에서 맵핑되지 않습니다.


1

스프링 부트 2.1.3에서 리소스가 404를 찾을 수 없다는 동일한 문제에 직면했습니다 . applicatiion.properties 에서 아래를 제거했습니다 .

#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,

제거 @enableWebMVC 제거 어떤 WebMvcConfigurer 오버라이드 (override)

// @ EnableWebMvc

또한 구성에 @EnableAutoConfiguration 이 있는지 확인하십시오 .

그리고 모든 정적 리소스를 src / main / resources / static에 넣고 마침내 마법처럼 작동했습니다.


2.2.6의 내 봄 버전과 @EnableAutoConfiguration 및 src / main / resources / static 아래에 파일이 있지만 작동하지 않고 500을 던집니다.
shivani thakur

1

스프링 부트 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;
    }

그리고 이것은 내 문제를 해결했다.


0

gradle과 eclipse를 사용하여 같은 문제가 있었으며 그것을 알아 내려고 몇 시간을 보냈습니다.

코딩이 필요하지 않습니다. 트릭은 메뉴 옵션 New-> Source Folder (NOT-> Folder)를 사용하여 src / main / resources 아래에 정적 폴더를 작성해야한다는 것입니다. 이것이 왜 작동하는지 모르지만 new-> source folder를 한 다음 폴더 이름을 static으로 지정하십시오 (그런 다음 소스 폴더 대화 상자에서 확인 해야하는 오류가 발생합니다 : 중첩을 해결하기 위해 다른 소스 폴더의 제외 필터 업데이트). 내 새 정적 폴더 index.html을 추가했는데 이제 작동합니다.


0

때로는 나머지 컨트롤러에 의해 전역 매핑을 재정의했는지 확인해야 할 가치가 있습니다. 간단한 예제 실수 (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@RequestMapping@RestControllerPOST


0

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/");
    }
}

0

제 경우에는 .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.로 나를 가리 켰습니다!


0

/ **에 대한 요청은 resourceProperties에 구성된 정적 위치로 평가됩니다 .

application.properties에 다음을 추가하면해야 할 유일한 작업 일 수 있습니다 ...

spring.resources.static-locations=classpath:/myresources/

기본 정적 위치를 덮어 씁니다.

ResourceProperties.CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
        "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

그렇게하지 않으려는 경우 리소스가 기본 폴더 중 하나에 있는지 확인하십시오.

요청 수행 : /public/example.html에 example.html을 저장하면 다음과 같이 액세스 할 수 있습니다.

<host>/<context-path?if you have one>/example.html

<host>/<context-path>/magico/*classpath : / magicofiles / *의 파일 과 같은 다른 URI를 원한다면 좀 더 구성이 필요합니다.

@Configuration
class MyConfigClass implements WebMvcConfigurer

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}

-1

위에서 말했듯이 파일은 $ClassPath/static/images/name.png/ static 또는 / public 또는 / resources 또는 / META-INF / resources에 있어야합니다 . 이 $ 클래스 경로 수단 main/resources또는 main/java디렉토리.

파일이 표준 디렉토리에없는 경우 다음 구성을 추가 할 수 있습니다.

@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.
}
...

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.