programing

스프링 부트가 정적 콘텐츠를 제공하지 않음

css3 2023. 3. 26. 11:38

스프링 부트가 정적 콘텐츠를 제공하지 않음

스프링 부트 프로젝트에서 정적 컨텐츠를 처리할 수 없습니다.

가 폴더 음 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년 이상 지난 후 사망자를 되살리지는 않았지만, 이전의 모든 답변들은 몇 가지 중요한 점을 놓치고 있습니다.

  1. @EnableWebMvc에서 "Disable"이 됩니다.org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration완전한 제어를 원하시면 됩니다만, 그렇지 않으면 문제가 됩니다.

  2. 이미 제공된 것 외에 정적 리소스의 다른 위치를 추가하기 위해 코드를 작성할 필요가 없습니다. 있습니다.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;
    
  3. 앞서 설명한 바와 같이 요청 URL은 이러한 위치를 기준으로 해결됩니다.따라서src/main/resources/static/index.html URL이 "URL"일 때 됩니다./index.html4.1는 Spring 4.1입니다.org.springframework.web.servlet.resource.PathResourceResolver.

  4. 의 매칭은 하게 되어 즉, 요구 URL 에 , 「」, 「URL」이 유효하게 되어 있습니다./index.html에는 에 /index.html스태틱 콘텐츠를 제공하는 경우 이 문제가 발생합니다.로 하려면 , 「」를 합니다.WebMvcConfigurerAdapter (하지 마십시오)@EnableWebMvc를 덮어씁니다.configurePathMatch다음과 같이 합니다.

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

IMHO, 코드에 버그가 적은 유일한 방법은 가능한 한 코드를 쓰지 않는 것입니다.이미 제공된 것을 사용하세요. 비록 그것이 약간의 연구가 필요하더라도, 수익은 그만한 가치가 있습니다.

2021년 7월 편집:

  1. 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/classesspring-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/resourcesservletContext의

또한 프로젝트를 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 방지하다WebMvcAutoConfigurationloading - 핸들러를 입니다.from loading - 로딩 - 로딩 - 로딩으로 리소스 핸들러를 만듭니다.에도 하다를 조건이 있습니다.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

했는데, 은 제, 는, 는, 서, 서, 서, 서, 서, 서, 서, 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/javadir.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