Spring Boot集成Spring Security时@Controller出现404错误求助
Spring Boot集成Spring Security时@Controller返回字符串报404问题解决
问题描述
构建集成Spring Security的Spring Boot基础应用,启动后访问URL出现404 Not Found错误。使用@RestController注解时接口功能正常,但换成@Controller注解就无法正常工作。
核心代码
Springsecurity1Application.java
package com.kpr.springsecurity1; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringSecurity1Application { public static void main(String[] args) { SpringApplication.run(SpringSecurity1Application.class, args); } }
MainController.java
package com.kpr.springsecurity1.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MainController { @RequestMapping("/open") public String open(){ return "This is open"; } @RequestMapping("/user") public String user(){ return "This is open"; } @RequestMapping("/admin") public String admin(){ return "This is open"; } @RequestMapping("/none") public String none(){ return "This is open"; } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.kpr</groupId> <artifactId>spring-security1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-security1</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
问题原因
@Controller注解的方法返回字符串时,Spring默认会将其视为视图名称,去查找对应的模板文件(如Thymeleaf、JSP等)。但当前项目既未配置视图解析器,也没有对应名称的视图文件,因此返回404。而@RestController等价于@Controller + @ResponseBody,会直接把返回的字符串作为响应体返回给客户端,所以能正常工作。
注:此404并非Spring Security权限问题(权限问题通常返回403),核心是视图解析逻辑导致的。
解决方案
根据实际需求选择以下两种处理方式:
方式一:返回字符串响应体
如果仅需返回字符串而非视图,可给方法添加@ResponseBody注解,或直接使用@RestController替代@Controller:
package com.kpr.springsecurity1.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping("/open") @ResponseBody public String open(){ return "This is open"; } // 其他方法同理添加@ResponseBody }
方式二:配置视图解析与视图文件
若确实需要返回视图(如HTML页面),需完成以下步骤:
- 添加模板引擎依赖(以Thymeleaf为例),在pom.xml中加入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 在
src/main/resources/templates目录下创建对应名称的HTML文件(建议规范视图名,比如方法返回"open",则创建open.html)。
额外检查
确认控制器类位于Spring Boot主类的同级或子包下(当前目录结构符合要求,主类在com.kpr.springsecurity1,控制器在com.kpr.springsecurity1.controller,可被自动扫描)。
内容的提问来源于stack exchange,提问作者priyatham reddy
相关产品推荐
相关产品推荐

