You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从JavaScript客户端向Jersey服务器发送字符串数组并正确接收

问题根源

  1. 当前服务端使用@BeanParam + @FormParam组合,用于解析application/x-www-form-urlencoded表单编码的请求参数。但jQuery ajax默认序列化数组参数时,会给参数名添加[]后缀,会将servingDates: ['jan','feb']转换为servingDates[]=jan&servingDates[]=feb,和@FormParam("servingDates")指定的参数名不匹配,导致Jersey无法识别注入。
  2. 如果期望使用JSON格式传参,@BeanParam注解不支持直接解析JSON请求体,会导致全量参数都无法正确绑定。

可选解决方案

方案1:保持表单提交逻辑,适配现有注解

仅修改前端ajax配置,开启traditional参数禁用数组后缀即可:

$.ajax({
    url: "http://localhost:8080/remote-loader/App/User/",
    type: 'POST',
    data: user,
    traditional: true, // 核心配置:序列化参数时不添加[]后缀
    contentType: "application/x-www-form-urlencoded; charset=UTF-8"
})

服务端原有代码无需修改,@FormParam会自动将多个同名的servingDates参数绑定到List集合中。

方案2:改用JSON格式传参(更推荐,适合复杂对象场景)

服务端修改
  1. 接口方法新增@Consumes注解指定接收JSON格式,去掉参数上的@BeanParam:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public ArrayList<User> createUpdateUser(@NotNull User user) {
    siteDao.addUser(user);
    Collection<User> l = siteDao.listSites();
    return new ArrayList<>(l);
}
  1. User类去掉属性上的@FormParam注解:
public class User {
    private List<String> servingDates = new ArrayList<>();
    
    public List<String> getServingDates() {
        return servingDates;
    }
    public void setServingDates(List<String> servingDates) {
        this.servingDates = servingDates;
    }
}
  1. 确保项目已引入Jersey JSON序列化依赖,例如jackson-jaxrs-json-provider。
前端修改

将请求体序列化为JSON字符串,指定JSON格式的contentType:

$.ajax({
    url: "http://localhost:8080/remote-loader/App/User/",
    type: 'POST',
    data: JSON.stringify(user),
    contentType: "application/json; charset=UTF-8"
})

内容的提问来源于stack exchange,提问作者rejkid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:54:03