Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 如何使控制器方法对Spring中的十六进制数敏感?_Java_Spring_Http_Hex - Fatal编程技术网

Java 如何使控制器方法对Spring中的十六进制数敏感?

Java 如何使控制器方法对Spring中的十六进制数敏感?,java,spring,http,hex,Java,Spring,Http,Hex,使用Spring编写自己的简单API。几天前注意到这不是一个bug,而是一个特性。 控制器方法: @GetMapping(value = "/author/{authorId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> getAuthor(@PathVariable Long authorId) { AuthorDto response = authorService.fin

使用Spring编写自己的简单API。几天前注意到这不是一个bug,而是一个特性。 控制器方法:

@GetMapping(value = "/author/{authorId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getAuthor(@PathVariable Long authorId) {
    AuthorDto response = authorService.findAuthorByAuthorId(authorId);
    return new ResponseEntity<>(response, HttpStatus.OK);
}
@GetMapping(value=“/author/{authorId}”,products=MediaType.APPLICATION\u JSON\u value)
public ResponseEntity getAuthor(@PathVariable Long authorId){
AuthorDto response=authorService.findAuthorByAuthorId(authorId);
返回新的ResponseEntity(response,HttpStatus.OK);
}
这个
http://localhost:8080/api/library/author/0x2090
http://localhost:8080/api/library/author/8336
将返回相同的对象

十六进制数
0x2090
将转换为十进制数
8336

如何检查并使控制器对此敏感


谢谢

我的答案是将
authorId
类型设置为
String
,将其重命名为authorIdStri,然后检查其格式:

试试看{
if(authorIdString.startsWith(“0x”)){
//十六进制数
字符串hexString=authorIdString.substring(2);
BigInteger h=新的BigInteger(十六进制字符串,16);
userId=h.longValue();
}否则{
//十进制数
userId=Long.parseLong(可能是ExString);
}
if(userId==-1){
//无法分析值
抛出新的NumberFormatException();
}
}捕获(数字格式){
// ...
}
System.out.println(userId);
//这是你的电话号码

虽然没有那么优雅,但我希望它能帮助您。

解决方案是在路径映射中使用正则表达式:

@RestController
@RequestMapping("/test")
public class FooController {
    @GetMapping("/{id:[\\d]+}")
    public String foo(@PathVariable Long id) {
        return "not hex";
    }

    @GetMapping("/{id:0[xX][0-9a-fA-F]+}")
    public String fooHex(@PathVariable String id) {
        return "hex";
    }
}

/test/8336将指向foo方法,/test/0x2090将指向fooHex方法。我在这里使用了数字和十六进制数正则表达式。

哇,好主意(y)是的,看起来不错。但是,我认为这不是最好的解决办法。。。我有近10个端点在get、post、delete和put操作中使用一些Id。。。我的端点计数将乘以2。。。一个是长的,一个是弦的