fileId序列化文件详情

说明

业务表只存fileId,序列化的时候,框架根据fileId查询文件名称,文件url。

解决前端或者后端再去根据fileId查文件详情。

使用说明

VO类添加注解

  • @FileInfo:序列化String类型的fileId(包括单条fileId,或者逗号拼接的多个文件字符串
  • @FileInfoList:序列化List<String>类型的fileId集合
@Data
public class TestVO {
	/** 单条fileId */
	@FileInfo
	private String fileId;

    /** 逗号拼接多条fileId */
	@FileInfo
	private String fileComma;

    /** 多条fileId集合 */
	@FileInfoList
	private List<String> fileList;
}

序列化会自动添加{属性名}+Info的新属性

比如下面的demo中的fileIdInfo、fileCommaInfo、fileListInfo

{
    "fileId": "1433238830559383554",
    "fileIdInfo": [
        {
            "fileId": "1433238830559383554",
            "fileName": "1.1.ico",
            "fileUrl": "http://127.0.0.1:9000/file-test/hr/onboarding/undefined77f00652ec1049e68b71630545712581.ico?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=mamba%40123%2F20210902%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210902T012152Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a61689603e4d0d38872d987e39ca5f0e76df4a83acc2618e054407bdf31b909e"
        }
    ],
    "fileComma": "1433238830559383554,1435863538313179138",
    "fileCommaInfo": [
        {
            "fileId": "1433238830559383554",
            "fileName": "1.1.ico",
            "fileUrl": "http://127.0.0.1:9000/file-test/hr/onboarding/undefined77f00652ec1049e68b71630545712581.ico?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=mamba%40123%2F20210902%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210902T012152Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a61689603e4d0d38872d987e39ca5f0e76df4a83acc2618e054407bdf31b909e"
        },
        {
            "fileId": "1435863538313179138",
            "fileName": "1.5.jpg",
            "fileUrl": "http://127.0.0.1:9000/file-test/hr/onboarding/1435862899063398402/fdffd272abac45ff86a1631171490872.jpg"
        }
    ],
    "fileList": [
        "1433238830559383554",
        "1435863538313179138"
    ],
    "fileListInfo": [
        {
            "fileId": "1433238830559383554",
            "fileName": "1.1.ico",
            "fileUrl": "http://127.0.0.1:9000/file-test/hr/onboarding/undefined77f00652ec1049e68b71630545712581.ico?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=mamba%40123%2F20210902%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210902T012152Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a61689603e4d0d38872d987e39ca5f0e76df4a83acc2618e054407bdf31b909e"
        },
        {
            "fileId": "1435863538313179138",
            "fileName": "1.5.jpg",
            "fileUrl": "http://127.0.0.1:9000/file-test/hr/onboarding/1435862899063398402/fdffd272abac45ff86a1631171490872.jpg"
        }
    ]
}

代码

注解

FileInfo.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = FileInfoSerializer.class)
public @interface FileInfo {
​
}
​

FileInfoList.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
​
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
​
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = FileInfoListSerializer.class)
public @interface FileInfoList {
​
}
​

VO

FileInfoVO.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
​
/**
 * @author 00351634
 * @version 1.0
 * @date 2024/11/27 19:51
 * @description: 文件信息
 */
@Data
@AllArgsConstructor
@RequiredArgsConstructor
public class FileInfoVO {
    /** 文件ID */
    private String fileId;
    /** 文件名称 */
    private String fileName;
    /** 文件路径 */
    private String fileUrl;
}
​

接口

FileInfoHandler.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import com.mamba.file.common.core.base.RetResult;
​
import java.util.List;
​
/**
 * @author qiangt
 * @version 1.0
 * @date 2023/10/19 14:50
 * @description: 文件信息处理接口
 */
public interface FileInfoHandler {
    RetResult<List<FileInfoVO>> queryFileInfoList(List<String> idList);
​
}
​

序列化

FileInfoSerializer.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import com.mamba.file.common.core.base.RetResult;
import com.mamba.file.common.core.util.SpringContextHolder;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
​
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
​
/**
 * 文件信息列化器
 *
 * @author qiangt
 * @since 2023-05-02
 */
@Slf4j
@NoArgsConstructor
public class FileInfoSerializer extends JsonSerializer<String> implements ContextualSerializer {
​
    public static final String FILE_VALUE_NAME_PATTERN = "%sInfo";
​
    private BeanProperty beanProperty;
    private FileInfo fileInfo;
    private FileInfoHandler fileInfoHandler;
​
    public FileInfoSerializer(FileInfo fileInfo) {
        this.fileInfo = fileInfo;
    }
​
​
    public void setDesensitization(final FileInfo fileInfo) {
        this.fileInfo = fileInfo;
    }
​
    @Override
    public void serialize(final String value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException {
        if (StringUtils.isEmpty(value)) {
            gen.writeObject(null);
            return;
        }
        gen.writeObject(value);
        List<FileInfoVO> fileInfoVOS = this.obtainDictValue(value);
        if (CollectionUtil.isNotEmpty(fileInfoVOS)) {
            gen.writeFieldName(this.generateDictValueName(gen.getOutputContext().getCurrentName()));
            gen.writeObject(fileInfoVOS);
        }
    }
​
    private String generateDictValueName(final String currentFiledName) {
        return String.format(FILE_VALUE_NAME_PATTERN, currentFiledName);
    }
​
​
    private List<FileInfoVO> obtainDictValue(final String value) {
        if (StrUtil.isBlank(value)) {
            return null;
        }
        List<String> idList = new ArrayList<>();
        if (value.indexOf(",") > 0) {
            idList = ListUtil.toList(value.split(","));
        } else {
            idList.add(value);
        }
        try {
            RetResult<List<FileInfoVO>> listRetResult = this.getFileInfoHandler().queryFileInfoList(idList);
            if (Objects.nonNull(listRetResult) && Objects.nonNull(listRetResult.getData())) {
                return listRetResult.getData();
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }
​
    private FileInfoHandler getFileInfoHandler() {
        if (Objects.isNull(this.fileInfoHandler)) {
            this.fileInfoHandler = SpringContextHolder.getBean(FileInfoHandler.class);
        }
        return this.fileInfoHandler;
    }
​
    @Override
    public JsonSerializer<?> createContextual(final SerializerProvider prov, final BeanProperty beanProperty) throws JsonMappingException {
        final FileInfo dict = beanProperty.getAnnotation(FileInfo.class);
        if (Objects.nonNull(dict)) {
            return new FileInfoSerializer(dict);
        }
        this.fileInfo = dict;
        return this;
    }
​
}
​

FileInfoListSerializer.java

package com.mamba.file.common.core.mvc.fileinfo;
​
import cn.hutool.core.collection.CollectionUtil;
import com.mamba.file.common.core.base.RetResult;
import com.mamba.file.common.core.util.SpringContextHolder;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
​
import java.io.IOException;
import java.util.List;
import java.util.Objects;
​
/**
 * 文件信息列化器
 *
 * @author qiangt
 * @since 2023-05-02
 */
@Slf4j
@NoArgsConstructor
public class FileInfoListSerializer extends JsonSerializer<List<String>> implements ContextualSerializer {
​
    public static final String FILE_VALUE_NAME_PATTERN = "%sInfo";
​
    private BeanProperty beanProperty;
    private FileInfoList fileInfoList;
    private FileInfoHandler fileInfoHandler;
​
    public FileInfoListSerializer(FileInfoList fileInfoList) {
        this.fileInfoList = fileInfoList;
    }
​
​
    public void setDesensitization(final FileInfoList fileInfoList) {
        this.fileInfoList = fileInfoList;
    }
​
    @Override
    public void serialize(final List<String> value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException {
        if (CollectionUtil.isEmpty(value)) {
            gen.writeObject(null);
            return;
        }
        gen.writeObject(value);
        List<FileInfoVO> fileInfoVOS = this.obtainDictValue(value);
        if (CollectionUtil.isNotEmpty(fileInfoVOS)) {
            gen.writeFieldName(this.generateDictValueName(gen.getOutputContext().getCurrentName()));
            gen.writeObject(fileInfoVOS);
        }
    }
​
    private String generateDictValueName(final String currentFiledName) {
        return String.format(FILE_VALUE_NAME_PATTERN, currentFiledName);
    }
​
​
    private List<FileInfoVO> obtainDictValue(final List<String> value) {
        if (CollectionUtil.isEmpty(value)) {
            return null;
        }
        try {
            RetResult<List<FileInfoVO>> listRetResult = this.getFileInfoHandler().queryFileInfoList(value);
            if (Objects.nonNull(listRetResult) && Objects.nonNull(listRetResult.getData())) {
                return listRetResult.getData();
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }
​
    private FileInfoHandler getFileInfoHandler() {
        if (Objects.isNull(this.fileInfoHandler)) {
            this.fileInfoHandler = SpringContextHolder.getBean(FileInfoHandler.class);
        }
        return this.fileInfoHandler;
    }
​
    @Override
    public JsonSerializer<?> createContextual(final SerializerProvider prov, final BeanProperty beanProperty) throws JsonMappingException {
        final FileInfoList dict = beanProperty.getAnnotation(FileInfoList.class);
        if (Objects.nonNull(dict)) {
            return new FileInfoListSerializer(dict);
        }
        this.fileInfoList = dict;
        return this;
    }
​
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值