You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot API修改端点路径后返回404问题求助

问题描述

我在返回resources/static文件夹中的HTML页面时遇到问题:单层级路径能正常返回HTML内容,但使用多层路径(包含多斜杠)时会出现404错误。

正常工作的控制器代码:

@Controller
@RequestMapping(value = "/api-documentation")
public class ApiDocumentationController {

    @GetMapping
    String gotoRedocUi(){
        return "Redoc-Integrate.html"; // 返回resources/static下的HTML文件
    }
}

修改后出现404的代码:

@Controller
@RequestMapping(value = "/api-documentation")
public class ApiDocumentationController {

    @GetMapping("/some/more/value")
    String gotoRedocUi(){
        return "Redoc-Integrate.html"; // 返回resources/static下的HTML文件
    }
}

即使不声明@GetMapping,直接修改@RequestMapping为多层路径(如/api-documentation/some/...)也会触发404。希望得到解决方法,同时想了解其他返回HTML的方式。


解决方案

一、404问题的核心原因及修复

出现该问题的本质是:当控制器映射到多层路径时,Spring MVC默认会以当前请求路径作为相对路径查找静态资源,导致资源路径解析错误。

修复方法1:使用绝对路径返回资源

在返回的文件名前添加/,强制Spring从静态资源根目录(resources/static)开始查找:

@Controller
@RequestMapping(value = "/api-documentation")
public class ApiDocumentationController {

    @GetMapping("/some/more/value")
    String gotoRedocUi(){
        return "/Redoc-Integrate.html"; // 前缀添加/,使用绝对路径定位资源
    }
}

修复方法2:配置Spring MVC视图解析器

通过显式配置视图解析器的前缀和后缀,确保无论请求路径层级如何,都能正确定位静态资源:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        // 配置视图解析器,指定静态资源根目录和后缀
        registry.jsp("/static/", ".html");
    }

    // 可选:配置全局静态资源映射,确保所有静态资源可被访问
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
    }
}

二、其他返回HTML的方法

1. 使用@ResponseBody直接返回HTML字符串

如果需要动态生成HTML或直接返回字符串形式的内容,可结合@ResponseBody使用:

@Controller
@RequestMapping("/api-documentation")
public class ApiDocumentationController {
    @GetMapping("/some/more/value")
    @ResponseBody
    String gotoRedocUi(){
        // 直接返回HTML字符串,或读取文件内容后返回
        return "<html><body><h1>Redoc UI</h1></body></html>";
    }
}

2. 使用ResponseEntity灵活返回HTML

这种方式可自定义响应头、状态码等信息:

@Controller
@RequestMapping("/api-documentation")
public class ApiDocumentationController {
    @GetMapping("/some/more/value")
    ResponseEntity<String> gotoRedocUi() throws IOException {
        // 读取静态HTML文件内容
        String htmlContent = Files.readString(Paths.get(ResourceUtils.getFile("classpath:static/Redoc-Integrate.html").getPath()));
        return ResponseEntity.ok()
                .contentType(MediaType.TEXT_HTML)
                .body(htmlContent);
    }
}

3. 直接通过静态资源映射访问

如果不需要控制器做额外逻辑,可直接配置Spring MVC静态资源规则,无需编写控制器:
在application.properties中添加配置:

spring.mvc.static-path-pattern=/api-documentation/**
spring.web.resources.static-locations=classpath:/static/

配置后,访问/api-documentation/some/more/value时,Spring会自动从static目录查找对应资源(若需映射到特定HTML,可将HTML文件放在对应层级目录,或配合路径重写规则)。


内容的提问来源于stack exchange,提问作者divine forever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:18:32