当前位置: 首页 > 知识库问答 >
问题:

使用Jackson[重复]处理@RequestBody中的Null和默认值

濮书
2023-03-14

我有时区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和小时差异=0.0,

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

编辑

我在课堂上使用过下面的内容,但它不起作用

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

共有2个答案

皇甫伟彦
2023-03-14

这是一种经典模式,首先需要从存储库中提取时区实体,然后将传入的JSON数据与现有记录数据合并。

public ResponseEntity<Object> updateTimeZone(@RequestBody TimeZoneDto dto) {
  final TimeZone timeZone = timeZoneRepository.findById( dto.getId() );
  // use object mapper or whatever and merge dto onto timeZone
  timeZoneRepository.saveOrUpdate( timeZone );
  return timeZone;
}
乐正德华
2023-03-14

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

  • 时区要负责在客户端和服务器之间传输数据,您只需声明此对象中需要的内容。(例如:无时区字段)

然后,您可以将时区设置为请求主体,并将该对象调整为时区属性(即获取所需值并设置为实体)。在调整此DTO之前,您可能需要从DB中获取时区属性。我想说最好是在服务/委托类中,而不是在rest控制器中。

 类似资料:
  • 我使用Java和Jackson库将JSON文件解析为Java类。我的问题是,如果值为null或空,我无法设置默认值。有可能吗?现在,我只是把它写在setters部分。 例如,我有一个JSON文件 在我的Java类中,如果值为null或空,我想将其设置为Java函数。 举个例子 所以,如果设置了这个值,那么就是它。如果不是,那应该是美国。

  • 我有以下一个批处理的Spring配置。我在生产批处理中遇到过一个问题,当一个特定的用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪。当我的batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的块,并再次处理所有以前的记录。当batch-commit-interval设置为1时,一旦抛出不可跳过的异常,批处理就会失败。 我尝试了batch-

  • spring-boot-starter-parent 2.4.1 spring-boot-starter-data-jpa postgres 12.5 一个实体的简短摘录: 该实体生成一个表,如下所示: 就是这样: 我们可以看到: null 问题 > 我想防止任何人设置Null,就像在branch1中那样。 如果我这样组织它: @columnDefinition=“varchar(255)defa

  • 我有这样基于方面的日志记录: 当我使用RequestBody执行请求时,它工作正常,会触发advice。但是,当我执行没有

  • 我读过许多类似的问题,包括:JQuery、Spring MVC@RequestBody和JSON——使其能够将JSON请求与JQuery/Ajax与Spring一起工作 要求是服务器只会接受应用程序/json类型。我使用的是Spring MVC控制器。代码通过@响应体以JSON形式发送响应。我想通过我的Spring MVC控制器中的@Request estbody获取信息。我正在使用JSP将JSO

  • 伙计们!我正在开发一个web应用程序,我决定使用Jackson作为JSON处理框架。 我愿意发送请求数据;假设POJO看起来像这样: 将其序列化如下: 但是我需要向该对象添加一些元数据,比如字段和。我以为会解决我的问题,但是我正在使用Jackson和泽西一起使用,所以我没有手动序列化对象,所以我不能使用。 我知道这个线程,但是没有一个答案可以满足我的需求,因为我认为,编写一个自定义序列化程序是有点