从请求正文 Spring Boot 中删除空属性

Posted

技术标签:

【中文标题】从请求正文 Spring Boot 中删除空属性【英文标题】:Remove null attributes from request body Spring Boot 【发布时间】:2022-01-12 03:37:25 【问题描述】:

我是 Spring Boot 新手,指的是 this 文章。它要求添加 @JsonInclude(Include.NON_NULL) 注释以从 response body 中删除 null 属性,但是我有兴趣从 request body 中删除 null 属性。 请建议我怎样才能做到这一点。

请求正文是:


    "userUuid": "2u9k2ld8f-ghj47dhj",
    "suggestion": null

请求的 DTO 类是:

@Data
@NoArgsConstructor
public class UserRequestDTO implements Serializable 
    private String userUuid;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String suggestion;

显然它不适合我。当我对请求正文进行字符串化并打印时,它包括suggestion attr,即null。 感谢您的帮助。

【问题讨论】:

您想删除null 值并将其替换为什么? 你在响应正文上成功了吗?关于请求 为什么从请求中删除?当你有空属性时,你想在你的 DTO 中放什么?因为没有办法忽略来自对象 Java 的属性... @JoãoDias 我只是想放弃那个属性。 @DilermandoLima 是的,我在响应正文中实现了它。我需要生成不包括空属性的有效负载的校验和。我不想替换 null attr 而是删除它。要生成签名,我将在请求正文上执行.toString() 请求是发送给你的东西,试图在服务器上解决它是行不通的。因此,除非您自己发送东西,否则这是行不通的。无论如何,请添加您用于测试的代码?你是如何stringify这个的? 【参考方案1】:

嗯...不要使用toString() 使用Jackson ObjectMapper。比如:

var objectMapper = new ObjectMapper();
var dto = objectMapper.readValue(JSON, UserRequestDTO.class);
var strNoNullFields = objectMapper.writeValueAsString(dto);

这样注释就起作用了。

无论如何,这不是非常理想的事情。您可能需要重新考虑您的设计如何计算校验和(您的问题有点像XY-problem)。

【讨论】:

【参考方案2】:

我需要生成不包括空属性的有效负载的校验和。我不想替换 null attr 而是删除它。要生成签名,我将在请求正文上执行 .toString()

我认为您正在寻找具有 dinamyc 属性的请求。

尝试在参数上使用HashMap<String,Object>

其他简单的方法是从 DTO 覆盖 toString() 并忽略空属性。

建议:除了仅将其用于日志记录之外,我认为两者都是不好的做法,最好创建一个方法 generateSignature() 处理所有规则。

【讨论】:

toString 不会转换为 json(杰克逊会这样做)。使用地图检索东西也不能解决问题,因为也可以有 null 值。

以上是关于从请求正文 Spring Boot 中删除空属性的主要内容,如果未能解决你的问题,请参考以下文章

缺少请求正文的 Spring Boot POST 请求?

从使用 Angular 7 的请求中接收 Spring Boot 中的空授权标头,但 Postman 工作正常

如何在 spring-boot Web 客户端中发送请求正文?

请求正文中的 Spring Boot Keycloak 客户端凭据

Spring Boot RestController - PostMapping - 将请求正文作为 InputStream [重复]

spring boot中请求json正文中存在变量键值时处理RequestBody