You need to enable JavaScript to run this app. 调用含多个@BeanParam参数的REST服务方法出现Unrecognized field错误
优惠活动
大模型
产品
解决方案
定价
更多

调用含多个@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 23:36:11