정적 컨텐츠를 제공하지 않는 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

야, 나는이 작업 솔루션을 찾기 위해 인터넷의 깊이를 여행했다. 이 키의 조합이었다 보인다 @EnableWebMvc및 WebMvcAutoConfigurationAdapter. 큰 시간 감사합니다!
— 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.ignored와security.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.