如何从JavaScript客户端向Jersey服务器发送字符串数组并正确接收
问题根源
- 当前服务端使用
@BeanParam+@FormParam组合,用于解析application/x-www-form-urlencoded表单编码的请求参数。但jQuery ajax默认序列化数组参数时,会给参数名添加[]后缀,会将servingDates: ['jan','feb']转换为servingDates[]=jan&servingDates[]=feb,和@FormParam("servingDates")指定的参数名不匹配,导致Jersey无法识别注入。 - 如果期望使用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格式传参(更推荐,适合复杂对象场景)
服务端修改
- 接口方法新增
@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); }
- 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; } }
- 确保项目已引入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
相关产品推荐
相关产品推荐

