调用含多个@BeanParam参数的REST服务方法出现Unrecognized field错误
问题原因排查
底层实现差异
JBoss EAP 7.2内置的JAX-RS实现为RESTEasy 3.6.x,该版本对多@BeanParam参数的处理存在已知兼容性Bug,仅第一个标注了@BeanParam的参数会被正常解析注入,后续的@BeanParam参数会被忽略。
代码笔误
你提供的OtherBeanRequest类存在类型不匹配问题:descr字段定义为String类型,但对应的getDescr方法返回值写为Long,会直接导致参数绑定或反序列化失败。
参数传递方式不匹配
@BeanParam设计用途是绑定非请求体来源的参数(包括查询参数、路径参数、请求头、表单参数等),如果你当前将所有参数放在PUT请求的JSON请求体中传递,Jackson反序列化逻辑只会将整个请求体映射到第一个方法参数,第二个参数无对应数据源,就会抛出字段无法识别的错误。
Arquillian测试走的是模拟参数注入流程,不会走真实HTTP请求的反序列化逻辑,因此可以正常运行。
参数名不匹配
报错提示无法识别的字段为desc,但你定义的参数名为descr,需确认前端/调用工具传递的参数名是否存在拼写错误,或者全局Jackson配置是否存在字段名截断逻辑。
可行解决方案
- 优先修正代码笔误,将
OtherBeanRequest的getDescr方法返回值修改为String:
public String getDescr() { return descr; }
- 如果你坚持保留多
@BeanParam的写法,调整参数传递方式:所有参数放在URL查询参数中传递,不要放到请求体中,示例调用路径:
PUT /update?id=123&descr=test_content
PUT请求的请求体留空即可,符合@BeanParam的设计使用规范。
- 如果必须使用JSON请求体传参,合并两个请求Bean为一个统一请求类,去掉多
@BeanParam配置:
// 统一请求类 public class UpdateRequest { @Valid private BeanRequest request1; private OtherBeanRequest request2; // 补充Getter、Setter方法 } // 调整后的接口定义 @PUT @Path("/update") public Response update(@Valid @RequestBody UpdateRequest request) { return Response.ok("OK").build(); }
- 如果你需要适配多
@BeanParam的写法,可在JBoss 7.2中自定义升级RESTEasy模块到3.9.x及以上版本,该版本已修复多@BeanParam注入的兼容性Bug。 - 检查前端/调用工具的传参,确认传递的字段名为
descr而非desc,排除参数名拼写错误问题。
内容的提问来源于stack exchange,提问作者Carlos Mazzoli
相关产品推荐
相关产品推荐

