英文:
Null check for a single id parameter on the Controller method
问题
在Spring Boot控制器中,我正在尝试验证如下所示的Long
类型的id字段:
@GetMapping("/{id}")
public ResponseEntity<EmployeeResponse> getById(@PathVariable @NotNull Long id) {
final EmployeeResponse response = employeeService.getById(id);
return ResponseEntity.ok(...);
}
但是当我尝试发送带有null id参数的请求时,我得到了以下错误:
"Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: ":id""
我还尝试使用long
和@Valid
注解,但没有任何意义,遇到了类似的错误。所以,是否有可能验证请求的id参数?
英文:
In a Spring Boot Controller, I am trying to validate an id field in Long
type as shown below:
@GetMapping("/{id}")
public ResponseEntity<EmployeeResponse> getById(@PathVariable @NotNull Long id) {
final EmployeeResponse response = employeeService.getById(id);
return ResponseEntity.ok(...);
}
But when I try to send request with null id parameter, ı get the following error:
> "Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: ":id""
I also tried using long
and @Valid
annotation, but does not make any sense and a similar error is encountered. So, is it possible to validate id parameter of the request?
答案1
得分: 3
不确定将@PathVariable
设置为@NotNull
是否有意义?因为如果它为null,则URL会不同。因此,您可以使用其他端点@GetMapping("/")
来处理。
英文:
Not sure if it make sense to have @PathVariable as @NotNull?
Because it's different url if it's null. So you could handle that with other endpoint @GetMapping("/")
答案2
得分: 0
另一种方法,我几乎总是在URL的路径和正常参数中使用的是:只需对每个参数使用String
。
由于URL可以被任何用户轻松操作,他们可以输入“.../sos”而不是有效的数字,你将收到相同的错误。
为什么呢?URL中的一切都是字符串。当Spring Boot注意到控制器接受一个Long作为参数时,它会尝试自行解析它。
如果你使用String,就不会发生这种情况,如前面提到的:URL中的一切都已经是字符串,SB不需要将其解析为任何其他数据类型。
我建议你也在方法中只使用String参数,然后通过.getById(Long.parseLong(id));
手动进行解析/转换。
这样你可以捕获任何解析异常并返回适当的错误消息。
英文:
Another approach, which I pretty much always use for path & normal params in the URL, is the following: Just use String
for every parameter.
As URL is easily manipulable by any user, they can e.g. just enter ".../sos" instead of a valid number and you'll receive the same error.
Why? Everything in a URL is a String. When Spring Boot notices the controller accepting a Long as a parameter, it tries to parse it by itself.
This won't happen if you use a String, as previously mentioned: everything in the URL already is a String and SB won't need to parse it to any other datatype.
I'd recommend you to just have String parameters in your method aswell and then just do the parsing/converting manually via .getById(Long.parseLong(id));
.
This way you can e.g. catch any parse exception and return an appropriate error message.
答案3
得分: 0
你需要在 **@GetMapping** 中添加数值,因为 URL 将等待带有数据的路径,因为数据也意味着路径。同时,你需要添加 **@PathVariable(required = false)**,这意味着在映射中,你的地址不会等待数据,如果你调用 ***"/"***,它可以为 **null**,在你的服务中,你会看到 id 的数据是 **null**,因为调用了路径的另一个值。
@GetMapping(value = {"/{id}", ""})
public ResponseEntity<EmployeeResponse> getById(@PathVariable(required = false) Long id) {
if (id == null) { // 当为 null 时执行某些操作
}
else {// 执行另一种操作
}
返回 "你的数据";
}
英文:
You need to add values to @GetMapping, because URL will wait path with data, cuz data also means path. Also you need to add @PathVariable(required = false), it means your address in mapping will not wait data, and can come null if you ust call "/", in your service you see null data for id, cuz calls another value for your path.
@GetMapping(value = {"/{id}", ""})
public ResponseEntity<EmployeeResponse> getById(@PathVariable(required = false) Long id) {
if (id == null) { // Do something when null
}
else {// do another thing
}
return "your data";
}
答案4
得分: 0
如果您正在使用@PathVariable(...)
,它们不能是可选的。这反映了路径变量的本质 - 它们为空并不是一个合理的选择。REST风格的URL始终需要完整的URL路径。如果您有一个可选组件,考虑使用@RequestParam(...)
。
您可以在实体中使用@NotNull
。
英文:
If you are using
@PathVariable(...)
They cannot be optional. This reflects the nature of path variables - it doesn't really make sense for them to be null. REST-style URLs always need the full URL path. If you have an optional component, consider use
@RequestParam(...)
instead.
You can use
@NotNull
in your entities itself.
答案5
得分: -1
我建议您检查这个链接,特别是第六段,其中他解释了哪种类型的约束适用于哪种数据类型。
英文:
I suggest you check this
especially sixth paragraph, where he explains which sort of constraints work for which datatypes.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论