我正在参加「掘金·启航计划」。在开发过程中,不免需要用到一些注解,但jdk和spring提供的注解有时候不能满足业务需求,需要自定义一些注解。例如,在上次开发中,需要对文件的路径进行保存入库,由于文件是存在oss上的,并且oss中设置的文件的路径是有时效性的,所以不能够将有时效性的路径存入数据库。
解决方案
将oss的文件的相对路径存入数据库。然后在取文件路径时,根据该相对路径解析为oss的完整的预览路径。
首先需要定义一个注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(
using = FileFieldSerializer.class
)
public @interface FileUrlConvert {
}
这个注解用在类的属性字段上。其中@JsonSerialize( using = FileFieldSerializer.class )这个方法就是解析路径的方法。
@JsonSerialize注解
@JsonSerialize注解是Jackson JSON序列化库提供的注解。它的作用是指定某个字段在序列化时使用指定的Serializer序列化器。@JsonSerialize的using属性指定要使用的Serializer序列化器的类。所以,@JsonSerialize(using = FileFieldSerializer.class)表示使用FileFieldSerializer这个序列化器来序列化注解修饰的字段。也就是说,加了这个自定义注解的属性在返回时会自动根据FileFieldSerializer这里面的序列化规则转换并输出。
FileFieldSerializer序列化类
public class FileFieldSerializer extends StdSerializer<String> implements ContextualSerializer {
public FileFieldSerializer() {
super(String.class);
}
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
return new FileFieldSerializer();
}
public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (StringUtils.isEmpty(s)) {
jsonGenerator.writeString(s);
} else {
String url = FileAccessUtils.getFileAccess().processPath(s);
jsonGenerator.writeString(url);
}
}
}
这个类需要继承StdSerialier抽象类,并重写serialize方法,其中s就是原始的字符串。需要在方法中将该字符串根据一定规则转换为需要展示的字符串,再用jsonGenerator.writeString(s)方法,即可将转换后的字符串输出。
注解的使用
public class ArticleProcessFile implements Serializable {
...
/**
* 文件路径
*/
@TableField("file_path")
@FileUrlConvert
private String filePath;
...
}
接口将该类直接返回便能够实现路径的转换。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END