JAX-RS参数提取时400与404错误的差异解析及示例请求
两种HTTP错误的核心差异与示例说明
先直接点明这两个错误的本质区别:
- HTTP 400(错误请求):服务器已经找到了匹配的资源方法,但路径变量无法转换为方法要求的参数类型,属于「请求参数格式非法」。
- HTTP 404(未找到):路径变量的类型转换失败直接导致服务器找不到任何匹配的资源方法,属于「请求的资源不存在」。
示例1:触发HTTP 400错误
假设我们有一个获取用户信息的接口,要求路径中的userId必须是整数类型:
@Path("/users") public class UserResource { @GET @Path("/{userId}") public Response getUserById(@PathParam("userId") int userId) { // 根据userId查询用户逻辑 return Response.ok("查询用户ID:" + userId).build(); } }
当客户端发送请求 GET /users/abc 时:
- JAX-RS 首先匹配到了
getUserById方法(路径模板/users/{userId}完全匹配请求路径); - 尝试把路径中的
abc转换为int类型时失败; - 因为资源确实存在,只是参数格式不对,所以返回HTTP 400错误请求。
示例2:触发HTTP 404错误
我们定义一个自定义的ProductId类型,只有当输入是合法数字字符串时才能成功转换,否则抛出异常:
// 自定义产品ID类型 public class ProductId { private int id; // 构造方法:仅接受合法数字字符串,否则抛出异常 public ProductId(String idStr) throws IllegalArgumentException { try { this.id = Integer.parseInt(idStr); } catch (NumberFormatException e) { throw new IllegalArgumentException("无效的产品ID格式"); } } public int getId() { return id; } } // 产品资源接口 @Path("/products") public class ProductResource { @GET @Path("/{productId}") public Response getProduct(@PathParam("productId") ProductId productId) { return Response.ok("产品ID:" + productId.getId()).build(); } }
当客户端发送请求 GET /products/abc 时:
- JAX-RS 在尝试匹配路径时,需要把
abc转换为ProductId类型,但转换失败抛出异常; - 此时服务器找不到任何能匹配
/products/abc的资源方法; - 因此返回HTTP 404未找到。
总结
简单来说:
- 400是「找到了资源,但参数不对」
- 404是「因为参数不对,根本没找到资源」
内容的提问来源于stack exchange,提问作者witek
相关产品推荐
相关产品推荐

