当使用aop方式打印日志时,使用@annotation
的方式,如:
@Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void log() {
}
如果Controller类有继承关系,如:
public interface BaseController {
@GetMapping("/get")
String get(@RequestParam String name, @RequestParam Integer age);
@RequestMapping("/map")
String map(@RequestParam String name);
}
@RestController
@RequestMapping("/demo")
@Slf4j
public class DemoController implements BaseController {
@PostMapping("/post")
public Resp post(@RequestBody @Validated Req req) {
log.info("post");
Resp resp = new Resp();
return resp;
}
@Override
public String get(@RequestParam String name, @RequestParam Integer age) {
log.info("get");
return "Hello World, name=" + name + ", age=" + age;
}
@Override
public String map(@RequestParam String name) {
log.info("map");
return name;
}
}
使用@annotation
的方式只能拦截到/demo/post
请求,不能拦截到/demo/get
和/demo/map
,即在BaseController类中指定的路径不能拦截,如何解决呢?
首先来说解决办法,
删除
DemoController
中的get
方法和map
方法,然后在BaseController
中定义方法的默认实现,需要JDK8以上,例如:然后运行代码,你会发现是有进你的切面的。
现在来说为什么会这样
对于你的这个切面来说,重点在于实现类上的方法有没有
@XXXMapping
这个注解,所以问题在于Java的继承和实现对于注解来说,关系是怎么样的。推荐你看这篇博客:子类上是否可以继承父类的注解这里引用那篇博客的总结