springboot自定义注解在controller上不执行

新手上路,请多包涵

图片描述

该注解加载controller类上,aop不执行。加到method上执行。

阅读 7.4k
2 个回答

方案一

注解形式

  • 注解类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AspLog {
    String value() default "";
}
  • Log类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DoLog implements Serializable {

    private Long id;
    /**
     * asplog value 属性值
     */
    private String aspVal;

    /**
     * 操作的具体类
     */
    private String doClass;
    /**
     * 操作方法
     */
    private String methodName;

    public Object getParams() {
        return params;
    }

    public void setParams(Object params) {
        this.params = params;
    }

    /**
     * 参数
     */
    private Object params;
}
  • aspect

@Aspect
@Component
public class DoLogAspect {



    @Pointcut("@annotation( com.huifer.securityuserview.aop.AspLog )")
    public void ddlog() {
    }

    @AfterReturning("ddlog()")
    public void save(JoinPoint joinPoint) {
        DoLog doLog = new DoLog();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        // 切点方法
        Method method = signature.getMethod();

        // 自定义注解的获取
        AspLog aspLog = method.getAnnotation(AspLog.class);
        String value;
        if (aspLog != null) {
            value = aspLog.value();
            doLog.setAspVal(value);
        }
        // 当前注解的class
        String doClassName = joinPoint.getTarget().getClass().getName();
        // 请求参数
        Object[] args = joinPoint.getArgs();
        // 请求函数名
        String methodName = method.getName();

        doLog.setDoClass(doClassName);
        doLog.setMethodName(methodName);
        doLog.setParams(args);


        System.out.println(doLog);

    }


}
  • controller
@Controller
public class HomeController {
    @RequestMapping(value = {"/", "/home"})
    @AspLog(value = "这是一个测试")
    public String home() {
        return "home";
    }

    @RequestMapping(value = {"/admin"})
    @AspLog(value = "这是一个测试")
    public String admin() {
        return "admin";
    }


    @RequestMapping(value = {"/vip"})
    @AspLog(value = "这是一个测试")
    public String vip() {
        return "vip";
    }

    @RequestMapping(value = {"/login"})
    @AspLog(value = "这是一个测试")
    public String login() {
        return "login";
    }

    @RequestMapping(value = {"/deny"})
    @AspLog(value = "这是一个测试")
    public String deny() {
        return "deny";
    }

}

clipboard.png

方案二

全局使用不添加注解
全局使用 对所有 controller做aop

按照你说的,应该是SpringBoot在自动扫描的时候,放到IOC容器的时候,没有把你的Log放到容器中导致没有执行。

方法一可以看看你的Log类的路径是不是在你启动的Application包的下面
方法二,自动下一个注解,用@Component

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题