我使用Jackson对我的Sping Boot 项目进行序列化/反序列化。
我有一个具有以下结构的DTO对象,
public class TestDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private UUID certificateId;
@NotNull
private Long orgId;
@NotNull
private CertificateType certificateType;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Valid
@NotNull
private PublicCertificateDTO publicCertificate;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Valid
private PrivateCertificateDTO privateCertificate;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private ZonedDateTime expiryDate;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private ZonedDateTime createdDate;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private ZonedDateTime updatedDate;
}
使用以下方法在我的单元测试中序列化此对象,
public static byte[] convertObjectToJsonBytes(TestDTO object)
throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
JavaTimeModule module = new JavaTimeModule();
mapper.registerModule(module);
return mapper.writeValueAsBytes(object);
}
导致具有WRITE_ONLY
访问权限的字段被忽略(原因很明显)。因此,在序列化对象中,我看到publicCertificate
和privateCertificate
为空值。
我试过设置mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
是否有其他方法可以忽略单元测试的这些属性?
5条答案
按热度按时间iaqfqrcu1#
虽然指定的解决方案可以工作,但它对于需求来说是一个大材小用。如果您想要的只是覆盖注解,则不需要自定义序列化程序。Jackson有一个mixin feature来满足这种琐碎的需求
请考虑以下简化的POJO:
如果要覆盖
@JsonProperty
注解,请创建另一个POJO,该POJO具有完全相同的名称(或相同的getter/setter名称)的变量:通过一个时间表模块将原始POJO和mixin关联起来:
aor9mmx12#
是否有其他方法可以忽略单元测试的这些属性?
**解决方案:**在
convertObjectToJsonBytes
方法中,可以用途:**参考:**Map器功能.USE_ANNOTATIONS
**注意:**这将禁用给定
ObjectMapper
的所有注解。iyzzxitl3#
通过为JUnit测试添加一个自定义序列化程序解决了这个问题。
因此,对于
TestDTO
,我添加了如下所示的串行化程序。我接着补充道:
以类似方式为嵌套对象
publicCertificate
和privateCertificate
添加和注册自定义序列化程序。jdzmm42g4#
另一个解决方案是用一个简单的自定义类覆盖注解检查器。这是最简单的示例:
其他Sping Boot**@自动连线对象Map器**的解决方案:
1.使用专用类,以便它可重用且可读性更强:
1.在测试中使用@BeforeEach(或她的老朋友)
fcy6dtqo5#
这里举一个简单的例子
}
}