【问题标题】:Wrapper type Path variable won't accept null value - Spring Boot包装器类型路径变量不接受空值 - Spring Boot
【发布时间】:2021-04-01 22:32:07
【问题描述】:

这是我们的控制器

@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: For input string: "null"

如果我们将 Integer 更改为 String,则调用将进入控制器,但为了进一步处理,我们需要使用 Integer。

我们查看了这个Spring MVC @Path variable with null value,并尝试使用这样的 URL 更改来调用 API

http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/blaaa/null,但是报错还是一样。

应该怎么做?

【问题讨论】:

    标签: spring-boot null integer wrapper path-variables


    【解决方案1】:

    如果您希望它可以为空,您可以通过以下方式实现它。首先,如果它可以为空,则所需的属性应该是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 当只是@ 987654327@ 被调用,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) {
    
    }
    

    【讨论】:

    • 第二种方法有效,但第一种无效。谢谢
    • @ArunSudhakaran 更多细节?什么不工作?有什么错误?刚刚从这里复制粘贴代码,它工作得很好。你在做什么接听电话?如果第二个有效,第一个也有效,唯一的区别是变量的类型和所需的。
    • 第一种方法是抛出与我之前得到的相同的错误
    • @ArunSudhakaran 再次,我们可以提供更多详细信息吗?您实际上是在 URL 中传递值“null”吗?
    • 不,我没有通过它
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2016-03-13
    • 2019-03-24
    • 2020-11-27
    • 2020-11-30
    • 2023-03-18
    相关资源
    最近更新 更多