web项目图片地址统一前缀处理

说明:

提示:这篇文章仅是记录自己成长路上的愚笨,不喜勿喷,同时也希望各路大神提出优秀的观点。谢谢!!


问题描述:

在web项目中往往图片地址在数据库中不会保存项目的请求地址前缀。使得项目在各个环境间迁移部署时能够自动获取请求地址前缀。
以前在项目中遇到图片地址都是程序员手动拼接地址前缀,这样会增加开发工作量,而且各处埋点,不便于统一管理。


解决方案:

由于现在项目多是前后端分离,前后端传输数据时使用的json格式,且springboot在controller中向前端传输json数据的时候默认是使用jackjson序列化。所以想在json序列化器中做手脚。
方案:注解+自定义序列化器

  1. 自定义注解:
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 {
}
  1. 自定义序列化器
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);
        }
    }
}
  1. 在实体类中加入注解
	/**
     * 店铺图片
     */
    @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);
    }

验证:

在这里插入图片描述
可以展示出来!
至此完成,希望各路大神提出各自优秀的观点。谢谢!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值