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

标签 java spring hibernate jpa jackson

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

相关文章:

java - 如何让程序等到计时器线程完成后再继续?

java - Spring 命名参数 : how can I parameterize Oracle interval in my query?

java - Spring Security 3.2、CSRF 和多部分请求

hibernate - JPA 2.0 subselect/subquery in order by 子句和条件api

hibernate - org.hibernate.ObjectDeletedException : deleted object would be re-saved by cascade (remove deleted object from associations):

java - 同一数据库中的 Cloudant 不同文档结构

java - 锁定 boolean 方法(如何从 boolean 方法返回任何内容或丢弃)

java - 如何在 Controller 的 java spring JPA 中进行批量更新

java - Oracle 中 CHAR 主键列的 hibernate 和填充

java - 在 Java 中转义 html