Spring MVC实现简易REST服务遇404错误,求概念性指导
先直接说核心问题:你访问/buscar/Interstellar出现404,本质是对REST请求参数传递的概念理解有偏差,下面帮你梳理几个关键概念点:
1. @RequestParam 与 @PathVariable 的核心区别
你的REST控制器用了@RequestParam String Title,这意味着参数是通过查询字符串来传递的,正确的访问URL应该是:
/buscar?title=Interstellar
而你尝试访问的/buscar/Interstellar是把参数放在了URL路径中,这种方式需要用@PathVariable来接收参数,这是两种完全不同的参数传递方式,也是你拿到404的主要原因。
2. 请求映射的冲突风险
你原有MVC控制器也定义了@RequestMapping("/buscar")的GET请求,虽然一个返回视图(ModelAndView),一个返回JSON(ResponseEntity),但它们的请求路径和HTTP方法完全一致。Spring在处理这种映射冲突时,可能会出现不可预期的优先级问题,这是REST服务实现中需要避免的概念性问题——同一个请求路径+方法应该唯一映射到一个处理器。
3. 参数名称的绑定规则
你的REST控制器中参数名为Title(大写首字母),而原有MVC控制器用的是小写title。Spring默认会按照参数名称来绑定请求参数,但如果你的项目编译时没有保留参数名(比如用了Java 8之前的编译规则,或者没开-parameters编译选项),可能会导致参数绑定失败。虽然这不是当前404的原因,但也是REST参数绑定中的重要概念。
4. Repository返回值的类型匹配
你的FilmRepository中findByTitle返回的是Iterable<Film>,但REST控制器中把它强转为List<Film>。虽然Iterable的实现类(比如Spring Data JPA返回的List)可以强转,但从概念上来说,更规范的做法是让Repository直接返回List<Film>,避免不必要的类型转换。
内容的提问来源于stack exchange,提问作者M.K

