This question already has answers here:
Spring Partial Update Object Data Binding
(8个答案)
3年前关闭。
我有以下时区POJO:
我在Spring Controller中有updateTimeZone方法,如下所示:
当我通过如下请求时:
然后当使用POJO映射时,它将自动将其他值转换为默认值,并变为:
因此,当我如下更新此POJO时
它会自动覆盖TimeZone = null和hourDifference = 0.0,
所以有什么方法可以让@RequestBody中的TimeZoneDto只有我在请求JSON中传递的那些列。
编辑
我在课堂上使用了以下内容,但无法正常工作
(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