Java 避免使用正则表达式为HTTP路径映射不明确的处理程序方法
我必须使用类似的控制器,一个按Id获取,另一个按名称获取 我读过一篇文章,其中解释了如何使用正则表达式进行解析,但它似乎不能正常工作Java 避免使用正则表达式为HTTP路径映射不明确的处理程序方法,java,spring,Java,Spring,我必须使用类似的控制器,一个按Id获取,另一个按名称获取 我读过一篇文章,其中解释了如何使用正则表达式进行解析,但它似乎不能正常工作 @GetMapping(value = "/trucks/{truckId:[0-9]+}") @ResponseStatus(HttpStatus.FOUND) @ResponseBody public final TruckDto getTruckId(@PathVariable(value = "truckId")
@GetMapping(value = "/trucks/{truckId:[0-9]+}")
@ResponseStatus(HttpStatus.FOUND)
@ResponseBody
public final TruckDto getTruckId(@PathVariable(value = "truckId")
final String truckId) {
LOGGER.debug("test: truckId({})", truckId);
Truck truck = truckService.getTruckById(Integer.parseInt(truckId));
return mappingService.map(truck, TruckDto.class);
}
/**
* @return Truck with an average.
*/
@ResponseStatus(HttpStatus.FOUND)
@ResponseBody
@GetMapping(value = "/trucks/{truckCode:[a-zA-Z0-9]+}")
public final TruckWithAvgPetrolDto getTruckByTruckCode(@PathVariable(value = "truckCode")
final String truckCode) {
LOGGER.debug("test: getTruckByTruckCode({})", truckCode);
TruckWithAvgDto truck = truckService.getTruckByTruckCode(truckCode);
return mappingService.map(truck, TruckWithAvgPetrolDto.class);
}
在不放置regex的情况下,这两种方法都会使我的测试失败,但在放置regex之后,接受数字和字母的getTruckByTruckCode方法通过,但get by truckId仍然会给出错误歧义处理程序方法,我遗漏了什么或者为什么它不起作用显然,一个数字同时匹配两个正则表达式,因此getruchid映射是不明确的。哦,但我认为,既然它可以同时接受数字和字母,它应该与另一个不同,但是前进的方向是什么呢?大概,卡车代码不能是纯数字,否则,你怎么知道一个数字序列是
id
还是code
。因此,代码正则表达式必须无法匹配纯数字值,例如,{truckCode:[0-9]*[a-zA-Z][a-zA-Z0-9]*}
,即可选的前导数字、非数字,然后是任何一组有效字符。--现在,如果代码可以是纯数字,那么您需要更改路径,例如,/trucks/5
将按id
,但是/trucks/code/5
将按code
。但是,您违反了REST原则。卡车是一种资源,具有一个唯一的资源URL:/trucks/{id}
。按其他值查找卡车是一个查询,因此/trucks/?code={code}
将是一个更合适的URL。我说过你可以尝试/trucks/code/BY3432
或者更好的/trucks/?code=BY3432
。你还不明白什么?