客户端GET请求传参至JAX-RS服务端时search参数始终为NULL排查
问题解决:Search参数始终为NULL的原因和修复方案
嘿,我一眼就发现问题出在哪啦!你的前端和后端在参数传递的方式上不匹配,导致后端接不到值,具体来说:
问题根源
前端JS里,你把搜索值拼在了URL的路径里:
var send = "http://localhost:8081/OhSnip/api/snippets/" + search;举个例子,如果输入的搜索词是
java,请求URL会是http://localhost:8081/OhSnip/api/snippets/java,这属于路径参数。但后端代码里,你用了
@QueryParam("search")来接收参数:public List<Snippet> getSearch(@QueryParam("search") String search)这个注解是用来获取查询字符串参数的,也就是URL里像
?search=java这种格式的参数,和前端传递的方式完全不对应,所以自然拿到的是null。另外你虽然在@Path("/{search}")里定义了路径参数占位符,但并没有用正确的注解去接收它。
两种修复方案
方案1:修改后端,用@PathParam接收路径参数
把@QueryParam("search")换成@PathParam("search"),这样就能正确读取URL路径里的搜索值了,修改后的后端代码:
@Path("/snippets") public class Resource { @Path("/{search}") @GET @Produces(MediaType.APPLICATION_JSON) public List<Snippet> getSearch(@PathParam("search") String search) { System.out.println(search); SnippetManager SM = SnippetManager.getInstance(); if (search != null) { return SM.getSnippets(search); } else { return SM.getSnippets(); } } }
方案2:修改前端,改用查询字符串传递参数
如果不想改动后端,就调整前端的URL拼接方式,把搜索值放在查询参数里:
$("#searchBtn").click(function() { $("#snipList").empty(); var search = $("#tagSearch").val(); // 把参数改成?search=xxx的格式 var send = "http://localhost:8081/OhSnip/api/snippets?search=" + search; $.getJSON(send, function(data, status) { console.log(data); $.each(data, function(index, value) { console.log(value.nome_snippet); $("#snipList").append("<div class='snippet'><h1>" + value.nome_snippet + "</h1><br><h3>" + value.classificacao + "/5</h3>"); }); }); });
补充说明
你之前的JS在其他API正常工作,应该是那些API的参数传递方式和后端注解是匹配的——要么是用查询参数对应@QueryParam,要么是路径参数对应@PathParam,这次只是不小心前后端没对齐而已~
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

