包装器类型路径变量不接受空值 - Spring 启动
Wrapper type Path variable won't accept null value - Spring Boot
这是我们的控制器
@GetMapping(path = "/getUsersForHierarchy/{entity}/{hierId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(@PathVariable(name = "entity", required = true) int entity,
@PathVariable(name = "hierId", required = true) Integer hierId) {
..................
..................
}
我们期待两个 Path variables
,一个是 int
类型(实体),另一个是 Integer
类型(hierId)。 hierId
可以为 null 或任何数值,这就是它保持为 Wrapper
的原因。但是它在发出这样的请求时出错
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/null
现在 Wrapper 应该接受 null
值,但我们遇到了这样的错误
无法将类型 'java.lang.String' 的值转换为所需类型 'java.lang.Integer';嵌套异常是 java.lang.NumberFormatException:对于输入字符串:“null”
如果我们将 Integer 更改为 String,调用将进入控制器内部,但为了进一步的处理,我们需要使用 Integer。
我们调查了这个 ,并尝试调用 API 改变 URL 像这样
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/blaaa/null,但是还是报错
应该怎么办?
如果您希望它可以为空,您可以通过以下方式实现。首先,如果它可以为空,则所需的 属性 应该是 false
。此外,考虑到 required = true
是默认值,因此无需指定它,如果路径变量的名称与相应变量的名称匹配,则您也不必指定名称。
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable(required = false) Integer hierId) {
}
考虑到我不喜欢故意允许空值进入应用程序,另一个好处可能是 Optional
类型需要 hierId
,因此以下内容将为您提供Optional.empty
当仅调用 /getUsersForHierarchy/123/
且 hierId
为空时。否则它将在提供 hierId
调用 /getUsersForHierarchy/123/321
:
时填充可选
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable Optional<Integer> hierId) {
}
这是我们的控制器
@GetMapping(path = "/getUsersForHierarchy/{entity}/{hierId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(@PathVariable(name = "entity", required = true) int entity,
@PathVariable(name = "hierId", required = true) Integer hierId) {
..................
..................
}
我们期待两个 Path variables
,一个是 int
类型(实体),另一个是 Integer
类型(hierId)。 hierId
可以为 null 或任何数值,这就是它保持为 Wrapper
的原因。但是它在发出这样的请求时出错
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/null
现在 Wrapper 应该接受 null
值,但我们遇到了这样的错误
无法将类型 'java.lang.String' 的值转换为所需类型 'java.lang.Integer';嵌套异常是 java.lang.NumberFormatException:对于输入字符串:“null”
如果我们将 Integer 更改为 String,调用将进入控制器内部,但为了进一步的处理,我们需要使用 Integer。
我们调查了这个
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/blaaa/null,但是还是报错
应该怎么办?
如果您希望它可以为空,您可以通过以下方式实现。首先,如果它可以为空,则所需的 属性 应该是 false
。此外,考虑到 required = true
是默认值,因此无需指定它,如果路径变量的名称与相应变量的名称匹配,则您也不必指定名称。
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable(required = false) Integer hierId) {
}
考虑到我不喜欢故意允许空值进入应用程序,另一个好处可能是 Optional
类型需要 hierId
,因此以下内容将为您提供Optional.empty
当仅调用 /getUsersForHierarchy/123/
且 hierId
为空时。否则它将在提供 hierId
调用 /getUsersForHierarchy/123/321
:
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable Optional<Integer> hierId) {
}