gpt4 book ai didi

java - 使用 Jackson 处理 @RequestBody 中的 Null 和 Default 值

转载 作者:行者123 更新时间:2023-11-30 07:12:57 35 4
gpt4 key购买 nike

我的时区 POJO 如下:

@Entity
public class TimeZoneDto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "timezone_sequence")
@SequenceGenerator(name = "timezone_sequence", sequenceName = "t_timeZone_master_id_seq", initialValue = 1, allocationSize = 1)
private Long id;
@Column
private String timeZone;
@Column
private String name;
@Column
private double hourDifference;
/* all gettet/setter */
}

我在 Spring Controller 中有 updateTimeZone 方法,如下所示:

@RequestMapping(value = "updateTimezone", consumes = "application/json", produces = "application/json", method = RequestMethod.POST)

public ResponseEntity<Object> updateTimezone(@RequestBody TimeZoneDto timeZoneDto){

}

当我传递如下请求时:

{"id":14,"name":"America/Los_Angeles -7:00 GMT"}

然后在与 POJO 映射时自动将其他值转换为默认值,变成:

id=14, timeZone=null, name=America/Los_Angeles -7:00 GMT, hourDifference=0.0

因此,当我更新此 POJO 时,如下所示

getEntityManager().merge(timezoneDto);

它自动覆盖 TimeZone = null 和 hourDifference = 0.0,

有什么方法可以让 @RequestBody 中的 TimeZoneDto 只包含我在请求 JSON 中传递的那些列。

编辑

我在类里面使用了下面的内容,但它不起作用

  @JsonInclude(value=Include.NON_EMPTY)
OR
@JsonInclude(value=Include.NON_DEFAULT)

最佳答案

我认为问题出在你的设计上。您将实体与 DTO 混合在一起。最常用的解决方案是将这两层分开。您可以有一个通用接口(interface),例如 TimeZoneInfo,然后有两个实现

  • TimeZoneDto - 负责在客户端和服务器之间传输数据,您只需在此对象中声明您需要的内容。 (例如:没有时区字段)
  • TimeZoneEntity - 表示持久实体(JPA/Hibernate)

然后,您可以将 TimeZoneDto 作为请求正文,并将该对象改编为 TimeZoneEntity(即获取所需值并设置为实体)。在调整此 DTO 之前,您可能需要从数据库获取 TimeZoneEntity。我想说最好是在服务/委托(delegate)类中而不是在休息 Controller 中。

关于java - 使用 Jackson 处理 @RequestBody 中的 Null 和 Default 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882639/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com