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
)