java Controller方法上单个id参数的空检查

u0sqgete  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(171)

在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参数?

vx6bjr1n

vx6bjr1n1#

不确定将@PathVariable设为@NotNull是否有意义?因为如果为null,则URL不同。因此您可以使用其他端点@GetMapping(“/”)处理此问题

gpfsuwkq

gpfsuwkq2#

如果您正在使用

@PathVariable(...)

它们不能是可选的。这反映了路径变量的本质--它们为null实际上没有意义。REST风格的URL总是需要完整的URL路径。如果您有可选组件,请考虑使用

@RequestParam(...)

而不是。
您可以在实体本身中使用@NotNull

x7yiwoj4

x7yiwoj43#

您需要将值添加到**@GetMapping**,因为URL将等待包含数据的路径,因为数据也意味着路径。您还需要添加**@PathVariable(required = false),这意味着您在Map中的地址不会等待数据,并且如果您只调用*"/"*,则可能会出现null**,在您的服务中,您会看到ID为null数据,因为为您的路径调用了另一个值。

@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";
    }
o2g1uqev

o2g1uqev4#

我建议你检查this,尤其是第六段,他解释了哪种约束适用于哪种数据类型。

qyswt5oh

qyswt5oh5#

另一种方法,我几乎总是使用URL中的path & normal参数,如下所示:只需对每个参数使用String
由于URL很容易被任何用户操纵,他们可以例如只输入“.../sos”而不是一个有效的数字,你会收到同样的错误。
为什么?URL中的所有内容都是String。当Sping Boot 注意到控制器接受Long作为参数时,它会尝试自己解析它。
如果您使用String,则不会发生这种情况,如前所述:URL中的所有内容都已经是一个字符串,SB不需要将其解析为任何其他数据类型。
我建议您在方法中也只使用String参数,然后通过.getById(Long.parseLong(id));手动进行解析/转换。
这样你就可以捕捉任何解析异常并返回一个适当的错误消息。

相关问题