JAX-RS @PathParam参数被忽略,请求匹配错误端点问题咨询
这事儿的核心是你混淆了路径参数(Path Param)和查询参数(Query Param)的区别,JAX-RS根本没识别到你想调用带productId的那个端点,自然就走了第一个通用的/get/products接口。
为什么会忽略你的参数?
你定义第二个端点时用了@Path("/get/products/{productId}")和@PathParam("productId"),这表示你期望productId是URL路径的一部分——也就是说,对应的请求URL应该长成这样:
GET http://localhost:8080/BookStoreWebService/productresource/get/products/193648
这里的193648是嵌入在路径里的,JAX-RS会把它捕获到@PathParam标注的变量里。
但你实际发送的请求是?productId=193648,这是查询参数——它是URL中?后面的键值对,和路径本身无关。你的第二个端点根本没处理这种参数格式,所以JAX-RS找不到匹配的端点,就默认匹配了路径完全吻合的第一个/get/products接口。
两种解决思路
根据你的需求选一种就行:
1. 调整请求URL适配路径参数
把请求改成符合路径参数格式的样子,也就是把?productId=193648换成路径末尾的/193648:
GET http://localhost:8080/BookStoreWebService/productresource/get/products/193648
这样JAX-RS就会正确匹配到第二个端点,@PathParam("productId")也能拿到193648的值。
2. 修改端点代码适配查询参数
如果你想保留?productId=193648的请求格式,就得把第二个端点的注解改成处理查询参数的形式。注意要调整路径避免和第一个端点冲突,比如把路径改成/get/product(单数):
@GET @Produces("application/json") @Path("/get/product") // 修改路径避免冲突 public String getProductById(@QueryParam("productId") String productId){ System.out.println("byID"); String result = null; try { Product productWithMatchingId = productService.findProductById(productId); if(productWithMatchingId != null) { result = productWithMatchingId.toString(); } } catch(NullPointerException e) { e.printStackTrace(); } System.out.println("Product with matching id: " + result); return result; }
这样发送GET http://localhost:8080/BookStoreWebService/productresource/get/product?productId=193648就能正确命中这个端点了。
内容的提问来源于stack exchange,提问作者Vismark Juarez

