스프링 부팅 시 폴더 요청이 "index.html" 파일에 매핑되지 않음
나는 가지고 있다static
다음 구조의 폴더:
index.displaces를 표시합니다.
docs/index.docs
Spring Boot가 요구를 올바르게 매핑합니다./
로.index.html
하지만 지도는 안 나와/docs/
에 요청하다/docs/index.html
(/docs/index.html
올바르게 동작합니다).
폴더/서브폴더 요청을 적절하게 매핑하는 방법index.html
파일?
뷰 컨트롤러 매핑을 수동으로 추가하여 다음 작업을 수행할 수 있습니다.
@Configuration
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/docs").setViewName("redirect:/docs/");
registry.addViewController("/docs/").setViewName("forward:/docs/index.html");
super.addViewControllers(registry);
}
}
첫 번째 매핑은 Spring MVC가 클라이언트에 리다이렉트를 송신하는 원인이 됩니다./docs
(후행 슬래시 없음)가 요구됩니다.이것은 에 상대적인 링크가 있는 경우에 필요합니다./docs/index.html
두 번째 매핑은 모든 요구를 에 전송합니다./docs/
(클라이언트에 리다이렉트를 송신하지 않고) 내부적으로index.html
에서docs
서브 디렉토리
Java 8이 인터페이스에 디폴트메서드를 도입한 후WebMvcConfigurerAdapter
는 Spring 5 / Spring Boot 2에서 폐지되었습니다.
이제 이 명령을 사용하면 경고가 표시됩니다.
WebMvcConfigurerAdapter 유형은 사용되지 않습니다.
따라서 @hzz의 솔루션을 다시 작동시키려면 다음과 같이 변경해야 합니다.
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/docs").setViewName("redirect:/docs/");
registry.addViewController("/docs/").setViewName("forward:/docs/index.html");
}
}
index.html에 대한 Spring Boot 매핑이 아니라 서블릿 엔진입니다(환영 페이지입니다).(스펙에 따라) 시작 페이지는 1개뿐이며, 디렉토리 브라우징은 컨테이너의 기능이 아닙니다.
이것은 항상 일치하려고 할 것이다.requestPath + /index.html
정적 리소스를 찾을 수 없는 경우:
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolverChain;
@Configuration
public class ResourceHandlerConfig implements WebMvcConfigurer {
static class IndexFallbackResourceResolver extends PathResourceResolver{
@Override
protected Resource resolveResourceInternal(HttpServletRequest request, String requestPath,
List<? extends Resource> locations, ResourceResolverChain chain) {
Resource resource = super.resolveResourceInternal(request, requestPath, locations, chain);
if(resource==null){
//try with /index.html
resource = super.resolveResourceInternal(request, requestPath + "/index.html", locations, chain);
}
return resource;
}
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.setOrder(Ordered.LOWEST_PRECEDENCE)
.addResourceHandler("/**")
.addResourceLocations("classpath:/static/")
//first time resolved, that route will always be used from cache
.resourceChain(true)
.addResolver(new IndexFallbackResourceResolver());
}
}
기본적으로는 스프링부트 show index.html 입니다.
그러나 index.displaces는 /resource/static 또는 /public이어야 합니다.
예:
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-static
언급URL : https://stackoverflow.com/questions/28437314/spring-boot-doesnt-map-folder-requests-to-index-html-files
'programing' 카테고리의 다른 글
컨트롤러에서 폼 제출을 트리거할 수 있습니까? (0) | 2023.03.05 |
---|---|
ng-click을 사용하여 angularJs에서 클래스 추가 및 제거 (0) | 2023.03.05 |
JSONC가 뭐죠?JSONC와 JSON-C는 다른가요? (0) | 2023.03.05 |
각도 JS 필터가 동일하지 않음 (0) | 2023.03.05 |
JSON.loads를 사용하여 Python datetime 개체로 변환하려면 어떻게 해야 합니까? (0) | 2023.03.05 |