我的时区 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/