This question already has answers here:
Spring Partial Update Object Data Binding
                                
                                    (8个答案)
                                
                        
                                3年前关闭。
            
                    
我有以下时区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混合在一起。最常用的解决方案是将这两层分开。您可以有一个通用的接口说TimeZoneInfo然后有两个实现


TimeZoneDto-负责在客户端和服务器之间传输数据,您仅在此对象中声明所需的内容。 (例如:没有timeZone字段)
TimeZoneEntity-表示一个持久实体(JPA /休眠)


然后,您可以将TimeZoneDto作为请求主体,并将该对象改编为(
获得必需的值并将其设置为实体)为TimeZoneEntity。调整此DTO之前,您可能需要从数据库获取TimeZoneEntity。我会说最好在服务/委托类中而不在rest控制器中。

09-13 06:19