说明
业务表只存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;
}
}