从请求正文 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 中删除空属性的主要内容,如果未能解决你的问题,请参考以下文章
从使用 Angular 7 的请求中接收 Spring Boot 中的空授权标头,但 Postman 工作正常
如何在 spring-boot Web 客户端中发送请求正文?
请求正文中的 Spring Boot Keycloak 客户端凭据
Spring Boot RestController - PostMapping - 将请求正文作为 InputStream [重复]