说明:
提示:这篇文章仅是记录自己成长路上的愚笨,不喜勿喷,同时也希望各路大神提出优秀的观点。谢谢!!
问题描述:
在web项目中往往图片地址在数据库中不会保存项目的请求地址前缀。使得项目在各个环境间迁移部署时能够自动获取请求地址前缀。
以前在项目中遇到图片地址都是程序员手动拼接地址前缀,这样会增加开发工作量,而且各处埋点,不便于统一管理。
解决方案:
由于现在项目多是前后端分离,前后端传输数据时使用的json格式,且springboot在controller中向前端传输json数据的时候默认是使用jackjson序列化。所以想在json序列化器中做手脚。
方案:注解+自定义序列化器
- 自定义注解:
import com.bjxst.common.aspectj.AddUrlPrefixSerializer;
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;
/**
* 图片添加URL前缀
* @author author
* @createDate 2020/12/18 8:54
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = AddUrlPrefixSerializer.class)//注解中引入自定义序列化器
public @interface AddUrlPrefix {
}
- 自定义序列化器
import com.bjxst.common.annotation.AddUrlPrefix;
import com.bjxst.common.utils.SecurityUtils;
import com.bjxst.common.utils.StringUtils;
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 org.apache.commons.lang3.ObjectUtils;
import java.io.IOException;
/**
* 处理图片前缀的json序列化器
*
* @author author
* @createDate 2020/12/18 9:04
*/
public class AddUrlPrefixSerializer extends JsonSerializer<String> implements ContextualSerializer {
private boolean addPrefix;
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
AddUrlPrefix addUrlPrefix = property.getAnnotation(AddUrlPrefix.class);
if (ObjectUtils.isNotEmpty(addUrlPrefix)) {
this.addPrefix = true;
}
return this;
}
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (addPrefix && StringUtils.isNotBlank(value)) {
//如果检测到有自定义注解进行前缀处理
value = SecurityUtils.getUrlPrefix().concat(value);
gen.writeString(value);
} else {
gen.writeString(value);
}
}
}
- 在实体类中加入注解
/**
* 店铺图片
*/
@AddUrlPrefix
@Excel(name = "店铺图片")
private String shopImg;
注意:在controller中向前端传输数据的时候一定要使用springboot序列化此类。例如:
/**
* 查询基础业务--店铺列表
*/
@PreAuthorize("@ss.hasPermi('system:shop:list')")
@GetMapping("/list")
public TableDataInfo list(SysShop sysShop) {
startPage();
//此list中就是含有注解的实体类
List<SysShop> list = sysShopService.selectSysShopList(sysShop);
return getDataTable(list);
}
验证:
可以展示出来!
至此完成,希望各路大神提出各自优秀的观点。谢谢!!!