我有以下使用Jersey实现的Java REST方法:

@POST
@Path("copy")
public List<Integer> copyCompanionTextRule(@QueryParam("ruleid") List<Integer> ruleIdList,
                                           @QueryParam("workgroupid") List<WorkgroupId> workgroupIds,
                                           @Context HttpHeaders hh)
throws ETMSException
{
    List<Integer> insertedItems = new ArrayList<Integer>();
    if ( null != ruleIdList ){
        for(Integer ruleId : ruleIdList) {
            insertedItems.addAll(copyCompanionTextRule(ruleId, workgroupIds));
        }
    }
    return insertedItems;
}


它接收一个整数列表和一个类型为WorkgroupId的对象列表,以及用于稍后将要进行的一些额外处理的上下文。

我正在使用Sencha EXTJS 4.2客户端,并且我的请求是通过以下方式执行的:

Ext.Ajax.request({
            url: '/sysadmin/companiontextrules/copy',
            method: 'POST',
            showException: true,
            scope: this,
            params: {
                ruleid: Ext.encode(ruleIdsArray),
                workgroupid: toWorkgroups
            },
            callback: function(options, success, response) {
                me.setLoading(false);

                if (!success) {
                    return;
                }
                this.destroy();
            }
        });


ruleIdsArray只是一个整数数组:[1274,1292,1745]。
toWorkgroups是对象数组,其对象具有与WorkgroupId实体相关的模型。

如您所见,两个列表都被作为查询参数处理,并且我在Ajax请求中使用“ params”配置。但是,这不起作用。

似乎ruleId数组为空,当它尝试迭代rulesIdList为空时,方法POST可以工作,但它始终返回一个空列表。

我知道我不能以“ url?ruleid = a&workgroupid = b”的形式使用它们。当我只是出于好奇而尝试时,我得到了QueryParamException和NumberFormatException,说规则数组被视为字符串。

当我对两个参数都使用“ Ext.encode”时,我在浏览器控制台中收到一条消息,指出最大调用堆栈大小已超出。

这是我从Chrome Console获得的:

java - POST中未处理数组QueryParam-LMLPHP

我已经尝试了几乎所有内容,但也许更多的眼睛可以帮助我,我非常感谢您的评论或任何帮助。

提前致谢。

最佳答案

看起来您的参数正在POST正文中,而不是作为查询参数。

url?ruleid = a&workgroupid = b正在获取NumberFormatException,因为RuleId应该是Integer。

url?ruleid = 1&workgroupid = b或url?ruleid = 1&ruleid = 2&workgroupid = b应该可以

09-05 05:15