gpt4 book ai didi

java - Mapper获取用@JsonIgnore注释的字段的空值(resttemplate)

转载 作者:行者123 更新时间:2023-11-30 01:47:40 25 4
gpt4 key购买 nike

我有一个使用 @JsonIgnore 作为 ID 字段的 DTO,一切正常。但是,出于使用 resttemplate 进行测试的目的,在使用映射器将字符串转换为 DTO 后,ID 将设置为 null。如何解决这个问题?

public class CarDTO {

@JsonIgnore
private Long id;
// there are more fields but not necessary to put all here

@JsonProperty
@ApiModelProperty(hidden = true)
public Long getId() {
return id;
}
}

这是 resttemplate 调用:

 @Test
public void createACar() throws Exception {

headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
CarDTO carDTO = getCarDTO("LL22222111");
HttpEntity<CarDTO> entity = new HttpEntity<>(carDTO, headers);

// Here the response has id with value
ResponseEntity response = restTemplate.postForEntity(BASE_URI, entity, String.class);
// But after conversion of string to carDTO id is set to null
CarDTO carResponse = mapper.readValue(response.getBody().toString(), CarDTO.class);

// Assertions ...
}

我注释掉了@JsonIgnore以确保它是否能正常工作,而且确实如此。

最佳答案

您指定:

@JsonIgnore
private Long id;

@JsonProperty
public Long getId() {
return id;
}

这意味着您为 Jackson 启用了序列化(使用 getter)并禁用了反序列化(在字段上使用 @JsonIgnore)

在您的测试中,这不会执行任何 JSON 反序列化(只是将响应正文存储为 String):

ResponseEntity response = restTemplate.postForEntity(BASE_URI, entity, String.class);

因此,响应对象正文中不应跳过 id。
它准确反射(reflect)了服务器作为响应返回的内容。
但这会对 CarDTO 执行反序列化:

CarDTO carResponse = mapper.readValue(response.getBody().toString(), CarDTO.class);

因此 Jackson 应用您在 CarDTO 的 Jackson 注释中指定的内容:如果需要反序列化该字段,只需删除该注解即可。

关于java - Mapper获取用@JsonIgnore注释的字段的空值(resttemplate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com