Spring Aop 统一处理 返回结果(修改图片链接)

/**
     * 返回 5 条蛋糕消息
     * @param page 传入的参数
     * @return
     */
    @GetMapping("/cake/{page}")
    @ResponseBody
    public List<CakeInfo> cake(@PathVariable Integer page) {
        int maxRange = 1000;
        if(page<=0||page >maxRange) {
            return Collections.emptyList();
        }

        return cakeInfoService.homePage(new Page<>(page, CakeInfo.SELECT_SIZE));
    }

图片存储在服务器上,然后数据库写入的是绝对路径,要把返回前端的路径修改一下,因为在拦截器设置的路径映射不一样
让哥告诉你 AOP的玩法

package com.ywfcake.demo.config;

import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;

import java.util.Objects;

/**
 * @Author lyr
 * @create 2020/3/22 14:06
 */
@Component
public class Constant {
    public String dir = Objects.requireNonNull(Objects.requireNonNull(ClassUtils.getDefaultClassLoader())
            .getResource(""))
            .getPath()+"/static/upload/tmp/" ;

    public String webDir = "/show/";
}

自定义一个标记注解

package com.ywfcake.demo.config;

import java.lang.annotation.*;

/**
 * @Author lyr
 * @create 2020/3/22 16:37
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ListHandler {
}

package com.ywfcake.demo.config;

import com.ywfcake.demo.entity.pojo.CakeInfo;
import com.ywfcake.demo.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author lyr
 * @create 2020/3/22 16:25
 */
@Aspect
@Component
@Slf4j
public class ListAspect {
    @Resource
    private Constant constant;

    //execution用于切出类的方法,其实还可以指定对应的打上注解的方法
    @Pointcut("@annotation(ListHandler)")
    public void delegate(){}

    @Around("delegate()")
    public Object around(ProceedingJoinPoint pjp) {
        Object result = null;
        try{
            //System.out.println("前");
            result = pjp.proceed();
            //System.out.println("后");
            //后置通知
        } catch (Throwable throwable) {
            //异常通知
            throw new ServiceException(throwable,"aop出现了异常");
        }finally {
            //最终通知
        }

        if(result!=null) {
            List<CakeInfo> list = (List<CakeInfo>)result;
            list = list.stream().map(cakeInfo -> cakeInfo.setImageLink(cakeInfo.getImageLink().replace(constant.dir,constant.webDir)))
                    .collect(Collectors.toList());
            log.info("AOP 返回结果{}",result);
            log.info("dir: {}",constant.dir);
            log.info("webDir: {}",constant.webDir);
            return list;
        }

        return result;
    }
}

在接口方法 或者实现方法上打个注解

@ListHandler
    @Cacheable(value = "homeFirstPage")
    @Override
    public List<CakeInfo> homeFirstPage() {
        return this.page(new Page<CakeInfo>(1,CakeInfo.SELECT_SIZE),homeWrapper).getRecords();
    }

这样就可以轻松复用处理逻辑

别忘记导包


        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>

        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>

        </dependency>
        <!--面向切面-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

AspectJ框架为 Aop实现提供了一套注解,用来取代 配置文件中为实现AOP功能所配置的臃肿代码

发布了175 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43923045/article/details/105031195
今日推荐