JAX-RS中@BeanParam使用Enum类型参数返回404的原因是什么?
问题根本原因
JAX-RS 规范对 @QueryParam、@PathParam 这类请求参数的自动类型转换,有明确的规则要求,目标类型需要满足以下任意一个条件才能被自动转换:
- 是Java原始类型(比如int、long)
- 存在可公开访问的、仅接收单个String类型参数的构造方法
- 存在名为
valueOf(String)的公开静态方法 - 存在名为
fromString(String)的公开静态方法(JAX-RS 2.0及以上版本支持) - 系统已注册可以处理该类型的
ParamConverterProvider实现
你第一次修改的枚举版本不符合以上任何规则,原因如下:
- 枚举的构造方法默认是private访问权限,就算你定义了单String参数的构造器,JAX-RS也无法调用,不符合构造方法转换的要求
- 枚举自带的默认
valueOf(String)方法,只能匹配枚举常量的字面名称(也就是你写的ASC、DESC大写字符串),你传小写的asc、desc,或者@DefaultValue写的asc,默认的valueOf方法会直接抛出IllegalArgumentException - 没有自定义符合要求的静态转换方法
参数转换失败后,JAX-RS默认会判定当前端点不匹配该请求,会继续路由查找其他适配的端点,找不到就返回404错误,而不是你预想的返回参数错误的400状态码。
你第二次修改枚举时,新增了符合规范的fromString(String)公开静态方法,满足了JAX-RS的转换规则,所以功能可以正常运行。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

