java - Spring Boot JUnit Jackson 无法反序列化所有字段
问题描述
我有一个无法通过的测试用例:
ContactDTO contactDTO = generateContactDTO();
HttpEntity<ContactDTO> request = new HttpEntity<>(contactDTO, headers);
ResponseEntity<Response> response = restTemplate.exchange(generateBaseUrl() + "/contacts", HttpMethod.POST, request, Response.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
这是我的 ContactDTO 课程:
public class ContactDTO {
@NotNull
@Size(min = 2, max = 100)
private String firstName;
@NotNull
@Size(min = 2, max = 100)
private String lastName;
@NotNull
@Size(min = 3, max = 100)
private String email;
@NotNull
@Size(min = 3, max = 50)
private String phoneNumber;
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
ContactDTO(@JsonProperty("firstName") @NotNull @Size(min = 2, max = 100) String firstName,
@JsonProperty("lastName") @NotNull @Size(min = 2, max = 100) String lastName,
@JsonProperty("email") @NotNull @Size(min = 3, max = 50) String email,
@JsonProperty("phoneNumber") @NotNull @Size(min = 3, max = 50) String phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}
String getFirstName() {
return firstName;
}
void setFirstName(String firstName) {
this.firstName = firstName;
}
String getLastName() {
return lastName;
}
void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
private void setEmail(String email) {
this.email = email;
}
String getPhoneNumber() {
return phoneNumber;
}
private void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
@PostMapping
public ResponseEntity<Response<String>> createContact(@Validated @RequestBody ContactDTO contactDTO, BindingResult bindingResult) {
if (bindingResult.getErrorCount() > 0) {
LOG.debug("Contact could not validated: {} and won't be created" +
" Validation error is as follows: {}", contactDTO, bindingResult);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new Response<>(Error.CONTACT_VALIDATION));
}
...
}
当我调试它时,我看到所有字段都在 contactDTO 中填充,然后再发送到控制器。但是,在控制器中,仅填充了电子邮件字段,并导致 HTTP 错误请求。
PS:我使用的是 Spring Boot 2.1.7.RELEASE
解决方案
由于没有公共访问器,杰克逊无法序列化我的 DTO。所以,我在我的 DTO 对象顶部添加了这个:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
推荐阅读
- ios - 为什么 SwiftUI 上下文菜单在预览中显示所有行视图?
- javascript - 在 Microsoft Edge 中使用画布上下文调整图像的亮度
- python - 请有人就代码格式提出建议
- telegram - 电报机器人。如何在用户文本输入中设置命令 /cmd?
- python-3.x - 数据熵
- azure - Azure Data Lake Storage Gen2 标签显示为容器而非文件系统
- forms - 如何重命名 Visual Studio 表单中文件夹中的所有文件?
- python - 我可以在 2 个不同的列表中匹配 2 个不同的值吗
- mongodb - MongoDB 4 无法在 CentOS 7.6 中启动,错误代码为 14
- typescript - 用于类型检查的带有扩展的通用可选类型