Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
Java 避免使用正则表达式为HTTP路径映射不明确的处理程序方法_Java_Spring - Fatal编程技术网

Java 避免使用正则表达式为HTTP路径映射不明确的处理程序方法

Java 避免使用正则表达式为HTTP路径映射不明确的处理程序方法,java,spring,Java,Spring,我必须使用类似的控制器,一个按Id获取,另一个按名称获取 我读过一篇文章,其中解释了如何使用正则表达式进行解析,但它似乎不能正常工作 @GetMapping(value = "/trucks/{truckId:[0-9]+}") @ResponseStatus(HttpStatus.FOUND) @ResponseBody public final TruckDto getTruckId(@PathVariable(value = "truckId")

我必须使用类似的控制器,一个按Id获取,另一个按名称获取 我读过一篇文章,其中解释了如何使用正则表达式进行解析,但它似乎不能正常工作

 @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
。你还不明白什么?