REST电影API按名称搜索的路径定义及PathParam解析错误问题
问题分析与解决方法
你这里踩了JAX-RS里路径参数和查询参数的常见坑啦!问题出在**@Path注解的用法和参数获取注解的选择**上:
错误原因
@Path注解只负责定义URL的路径部分,不能包含?以及后面的查询参数(比如?text=name这种写法是完全错误的)。而且你想用@PathParam获取查询参数,这也是不对的——@PathParam是用来抓取路径里的变量(比如/movies/{id}里的id),而URL中?后的参数属于查询参数,得用@QueryParam来获取。
修正后的代码
把你的代码改成这样就可以正常工作了:
@GET @Path("/search") @Produces(MediaType.APPLICATION_JSON) public Response getMovieByName(@Context HttpServletRequest req, @QueryParam("text") String name) { if (!checkLoggedIn(req)) { throw new WebApplicationException("User not logged."); } return buildResponse(movieService.getMovieByName(name)); }
关键修改点说明
- 把@Path里的
/search?text=name改成了/search:这才是正确的路径定义,查询参数不需要写在@Path里 - 把
@PathParam("name")换成了@QueryParam("text"):因为你的前端请求应该是GET /search?text=要搜索的电影名,这里的text是查询参数的键,@QueryParam要和它对应。如果想让前端用?name=xxx传参,那把@QueryParam("text")改成@QueryParam("name")就行 - (可选)如果希望搜索参数是可选的,可以给@QueryParam加默认值:
@QueryParam("text") @DefaultValue("") String name
这样修改后,当前端发送GET /search?text=星际穿越的请求时,name变量就会被正确赋值为星际穿越,然后传给你的movieService处理啦。
内容的提问来源于stack exchange,提问作者Arnau Van Boschken ArnauB
相关产品推荐
相关产品推荐

