【问题标题】:Tell Jackson to ignore a property that is a array/collection of a specific type告诉 Jackson 忽略作为特定类型的数组/集合的属性
【发布时间】:2022-11-20 23:20:21
【问题描述】:

背景

  • 我想克隆存储 Spring Boot 请求值的 DTO。
  • 我无法控制这些 DTO,因此无法添加 transient 修饰符来忽略这些字段。

我试过的

我试着用 Jackson 的 ObjectMapper 写了一个方法。您可以使用 @JsonIgnoreTypeObjectMapper#addMixIn() 根据它们的类忽略不可序列化的字段,而无需更改 DTO 的定义。

private Object makeClone(Object obj) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
    try {
        return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

@JsonIgnoreType
class JacksonMixInForIgnoreType {}

问题

你不能用这个策略忽略像MultipartFile[] fileArray;这样的字段。当你在 DTO 中有一个 MultipartFile 数组来上传多个文件时,上面的代码会抛出这样的异常:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.example.uploadingfiles.DeepCopyDto["fileArray"]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile[0]->org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])
        at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.13.1.jar:2.13.1]
        at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) ~[jackson-databind-2.13.1.jar:2.13.1]
 ...

问题

有没有办法告诉杰克逊忽略一个特定类型的数组/集合的属性?

【问题讨论】:

  • 你试过了吗:.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class)?它应该以相同的方式工作。您使用哪个版本的 Jackson?

标签: java jackson deep-copy


【解决方案1】:

我正在使用 Jackson Databind 2.13.1。以下代码适用于MultipartFile[](基于@Michael Ziober 的评论):

private Object makeClone(Object obj) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(MultipartFile.class, JacksonMixInForIgnoreType.class);
    mapper.addMixIn(MultipartFile[].class, JacksonMixInForIgnoreType.class);
    try {
        return mapper.readValue(mapper.writeValueAsString(obj), obj.getClass());
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}

而且我找不到用ObjectMapper#addMixIn()忽略List<MultipartFile>的方法。

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2011-04-06
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多