/**
* 返回 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功能所配置的臃肿代码