Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Spring控制器使用大@PathVariable超时_Regex_Spring_Rest_Spring Mvc - Fatal编程技术网

Regex Spring控制器使用大@PathVariable超时

Regex Spring控制器使用大@PathVariable超时,regex,spring,rest,spring-mvc,Regex,Spring,Rest,Spring Mvc,好吧,我今天一直在琢磨一个棘手的谜语。首先是我的控制器: @RequestMapping(value = "/batch/{itemIds:(?:[0-9]+[,]?)+}", method = RequestMethod.DELETE) public void batchDeleteItem( @PathVariable String itemIds, Principal principal, HttpServletResponse httpSe

好吧,我今天一直在琢磨一个棘手的谜语。首先是我的控制器:

@RequestMapping(value = "/batch/{itemIds:(?:[0-9]+[,]?)+}", method = RequestMethod.DELETE)
public void batchDeleteItem(
        @PathVariable String itemIds,
        Principal principal,
        HttpServletResponse httpServletResponse) throws CustomException {

    for (String itemIdString: itemIdString.split(",")) {
        long
            itemId = Long.parseLong(itemIdString.trim());
        itemService.deleteItem(principal.getName(), itemId);
    }

    httpServletResponse.setStatus(HttpServletResponse.SC_ACCEPTED);
}
如果不是很明显,可以在一次对控制器的调用中删除一组项目。上述方法适用于大约5项,但当指定6+时,调用超时。我在控制器代码中加入了日志记录语句,但它们从未被打印出来!换句话说

作品:

  • 旋度-u测试:通过'http://localhost:8080/rest/item/batch/23,24,25,26,27'-X删除
  • 接受报税表
  • 项目被删除
超时:

  • 旋度-u测试:通过'http://localhost:8080/rest/item/batch/23,24,25,26,27,28,29,30,31,32,33'-X删除
  • 永久挂起(或客户端超时)
  • 项目不会被删除
有什么想法吗?提前谢谢

更新:


目前,我正通过让客户端指定CSV格式的请求体(而不是URL本身)来解决这个问题。不幸的是,这意味着使用HTTP PUT而不是HTTP DELETE。如果有人能弄清楚到底发生了什么,我仍然会保留这个问题。

在服务器挂起时,您能进行线程转储并发布HTTP线程状态(可以匿名化)吗?使用
jstack
jvisualvm
jconsole
。不确定这是否有帮助,但我会使用正则表达式
\d+(?:,\d+)
(一系列数字后跟一个或多个逗号数字序列对)-至少,这将消除触发控制器时不存在id的情况。@CodeJockey这是一个更漂亮的正则表达式,但是[0-9]+中的+不会强制至少存在一个id吗?顺便说一句,我仍然在使用您的正则表达式:-),事实上,我的原始建议中确实出现了一个错误:我将使用
\d+(?:,\d+*
(否则您至少需要两个ID)来回答您的问题,是的!它将强制至少有一个ID-我写道“这将消除触发控制器时没有ID的情况”-我假设,因为它似乎是为了删除内容而设计的,如果没有提供ID号,控制器将不需要运行(无需删除)-如果不是这样,然后您可以将第一个
+
更改为
*
\d*(?:,\d+*
),这会产生允许第一个id插槽使用前导空字符串的潜在副作用(例如,允许
../batch/,24,25,26