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

问题描述 投票:0回答:2

背景

  • 我想克隆在 Spring Boot 中存储请求值的 DTO。
    • 有时它有一个不可序列化的字段(即
      MultipartFile
      ),所以我无法使用像
      https://stackoverflow.com/a/64066/3902663
      那样使用
      ObjectOutputStream
      /ObjectInputStream的策略。
  • 我无法控制这些 DTO,因此无法添加
    transient
    修饰符来忽略这些字段。

我尝试了什么

我尝试用杰克逊的

ObjectMapper
写一个方法。您可以使用
@JsonIgnoreType
ObjectMapper#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 忽略特定类型的数组/集合的属性吗?

java jackson deep-copy
2个回答
0
投票

我正在使用 Jackson Databind 2.13.1。以下代码适用于

MultipartFile[]
(基于@Michał 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);
    }
}

而且我找不到用

List<MultipartFile>
忽略
ObjectMapper#addMixIn()
的方法。


0
投票
TypeFactory typeFactory = mapper.getTypeFactory();
CollectionType collectionType = typeFactory.constructCollectionType(List.class, MultipartFile.class);
mapper.configOverride(collectionType.getRawClass()).setIsIgnoredType(true);

此代码对我有用,请尝试。

© www.soinside.com 2019 - 2024. All rights reserved.