如何在Spring GET servlet中保留空值?

3
@RestController
public class MyController {
    @GetMapping("/get)
    public void get(Map<String, String> params) {
        println(params.get("optional")); //"null"
    }

    @PostMapping("/post)
    public void post(Map<String, String> params) {
        println(params.get("optional")); //null
    }
}

localhost:8080/get?key=value&optional=null

结果:键 optional 的值将被写成 String 类型的 "null",而不是 null 类型。

而一个 POST 请求将按照以下方式工作:

{
    "key": "value",
    "optional": null
}

问题:如何使 GET 请求的行为与 POST 相同?也就是说,如何告诉 Spring 将 GET 请求中的 null 字符串解释为真正的 null?
3个回答

3

你不能像在 JSON 中那样通过 HTTP 查询参数传递null。因为在 HTTP 查询中,null 没有特殊含义,会被视为普通字符串处理。 相反,只需完全不传递可选参数。

localhost:8080/get?key=value

1
像@Nikolai所说,null在查询中没有特殊含义。查询通常被称为“查询字符串”,例如在AWS API Gateway中,这更加描述性地告诉您它是一个字符串,而不是Map,字符串只编码了字符,此上下文中没有null的概念。
在我看来,如果可以避免使用Map,最好不要使用它,而应该使用强类型,并列出所有可能的查询参数,对于非必需输入的可选参数。如果您希望用户指定Map,则应该在BODY中进行,但是GET带有BODY感觉不对,因此您可能需要更改HTTP方法。
如果您有许多参数,这就是为什么要使用Map的原因,请记住,某些浏览器将URL中的字符限制为2048个,因此这可能很危险,并且由于此限制,用户可能无法指定他们需要的所有参数的情况。
简而言之,Map 应该在请求体中。

1
你也可以像这样做。
@RequestParam(name = "optional", required = false) String optional

Spring文档


2
当传递“null”字符串时,这并没有帮助。 - Nikolai Shevchenko
正确,但您可以放弃可选参数,“String optional” 将为 NULL,以便其余代码可以正常工作。 - Dylan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接