Spring MVC中dispatcherServlet无法解析getAllUsers视图求助
访问http://localhost:8081/user/getAllUsers时出现白标错误,报错信息如下:
上下文路径为[]的servlet [dispatcherServlet]执行Servlet.service()时抛出异常:[无法在名为'dispatcherServlet'的servlet中解析名为'getAllUsers'的视图]
根本原因:
jakarta.servlet.ServletException: Could not resolve view with name 'getAllUsers' in servlet with name 'dispatcherServlet'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1394) ~[spring-webmvc-6.0.10.jar:6.0.10]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1159) ~[spring-webmvc-6.0.10.jar:6.0.10]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1098) ~[spring-webmvc-6.0.10.jar:6.0.10]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.10.jar:6.0.10]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.10.jar:6.0.10]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.10.jar:6.0.10]
已确认的信息:
- JSP文件
getAllUsers.jsp位于webapp/WEB-INF/jsp/user/路径下 - 控制器中存在处理
/user/getAllUsersGET请求的方法,返回视图名getAllUsers - Spring MVC配置类中视图解析器前缀为
/WEB-INF/jsp/,后缀为.jsp
控制器代码:
@Controller @RequestMapping("/user") @EnableWebMvc @ComponentScan(basePackages = "com.example.UserManagment") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/getUser") public Optional<UserModel> showUser(@RequestParam Long id){ return userService.findById(id); } @GetMapping("/getAllUsers") public String showAllUser(Model model){ List<UserModel> users = userService.getAll(); model.addAttribute("users",users); return "getAllUsers"; } }
1. 修正视图名路径匹配
你的JSP文件实际路径是/WEB-INF/jsp/user/getAllUsers.jsp,结合视图解析器的前缀/WEB-INF/jsp/和后缀.jsp,返回的视图名需要加上user/前缀才能匹配到文件。修改控制器方法:
@GetMapping("/getAllUsers") public String showAllUser(Model model){ List<UserModel> users = userService.getAll(); model.addAttribute("users",users); return "user/getAllUsers"; // 补充user/路径前缀 }
2. 迁移全局配置注解
@EnableWebMvc和@ComponentScan是Spring MVC的全局配置注解,不应放在控制器类上,需创建独立的配置类:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example.UserManagment") public class WebConfig implements WebMvcConfigurer { // 配置视图解析器 @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); return resolver; } }
然后删除控制器类上的@EnableWebMvc和@ComponentScan注解,控制器仅保留业务相关注解:
@Controller @RequestMapping("/user") public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/getUser") public Optional<UserModel> showUser(@RequestParam Long id){ return userService.findById(id); } @GetMapping("/getAllUsers") public String showAllUser(Model model){ List<UserModel> users = userService.getAll(); model.addAttribute("users",users); return "user/getAllUsers"; } }
3. 验证文件路径一致性
确认webapp/WEB-INF/jsp/user/getAllUsers.jsp文件存在,且文件名大小写与返回的视图名完全匹配(Spring MVC视图解析默认区分大小写)。
内容的提问来源于stack exchange,提问作者Kunciak

