在Spring Boot Controller中,我尝试验证Long
类型中的id字段,如下所示:
@GetMapping("/{id}")
public ResponseEntity<EmployeeResponse> getById(@PathVariable @NotNull Long id) {
final EmployeeResponse response = employeeService.getById(id);
return ResponseEntity.ok(...);
}
但是,当我尝试发送带有null id参数的请求时,会出现以下错误:
"无法将类型" java. lang. String "的值转换为所需类型" java. lang. Long ";对于输入字符串:":识别码""
我也试过使用long
和@Valid
注解,但是没有任何意义,并且遇到了类似的错误。那么,是否可以验证请求的id参数?
5条答案
按热度按时间vx6bjr1n1#
不确定将@PathVariable设为@NotNull是否有意义?因为如果为null,则URL不同。因此您可以使用其他端点@GetMapping(“/”)处理此问题
gpfsuwkq2#
如果您正在使用
它们不能是可选的。这反映了路径变量的本质--它们为null实际上没有意义。REST风格的URL总是需要完整的URL路径。如果您有可选组件,请考虑使用
而不是。
您可以在实体本身中使用
@NotNull
。x7yiwoj43#
您需要将值添加到**@GetMapping**,因为URL将等待包含数据的路径,因为数据也意味着路径。您还需要添加**@PathVariable(required = false),这意味着您在Map中的地址不会等待数据,并且如果您只调用*"/"*,则可能会出现null**,在您的服务中,您会看到ID为null数据,因为为您的路径调用了另一个值。
o2g1uqev4#
我建议你检查this,尤其是第六段,他解释了哪种约束适用于哪种数据类型。
qyswt5oh5#
另一种方法,我几乎总是使用URL中的path & normal参数,如下所示:只需对每个参数使用
String
。由于URL很容易被任何用户操纵,他们可以例如只输入“.../sos”而不是一个有效的数字,你会收到同样的错误。
为什么?URL中的所有内容都是String。当Sping Boot 注意到控制器接受Long作为参数时,它会尝试自己解析它。
如果您使用String,则不会发生这种情况,如前所述:URL中的所有内容都已经是一个字符串,SB不需要将其解析为任何其他数据类型。
我建议您在方法中也只使用String参数,然后通过
.getById(Long.parseLong(id));
手动进行解析/转换。这样你就可以捕捉任何解析异常并返回一个适当的错误消息。