告诉Jackson忽略特定类型的数组/集合属性

gg58donl  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(88)

背景

  • 我想克隆存储来自Sping Boot 中请求的值的DTO。
  • 有时它有一个不可序列化的字段(例如MultipartFile),所以我不能像使用https://stackoverflow.com/a/64066/3902663那样使用ObjectOutputStream/ObjectInputStream的策略。
  • 我无法控制这些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]
 ...

问题

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

c6ubokkw

c6ubokkw1#

我使用的是JacksonDatabind 2.13.1,下面的代码适用于MultipartFile[](基于@ MichaZiober的评论):

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>的方法。

相关问题