从上下文中获取所有的原生controller

 1     /**
 2      * 获取项目所有被注解修饰的url
 3      * @param run
 4      */
 5     public void getAllUrl(ConfigurableApplicationContext run) {
 6         //获取restcontroller注解的类名
 7         String[] beanNamesForAnnotation = run.getBeanNamesForAnnotation(RestController.class);
 8         //获取类对象
 9         for (String str : beanNamesForAnnotation) {
10             Object bean = run.getBean(str);
11 
12             //处理被AOP关照了的Controller
13             while (AopUtils.isAopProxy(bean)) {
14                 try {
15                     bean = ((Advised) bean).getTargetSource().getTarget();
16                 } catch (Exception e) {
17                     throw new RuntimeException("get target bean failed", e);
18                 }
19             }
20 
21             Class<?> forName = bean.getClass();
22             RequestMapping declaredAnnotation = forName.getAnnotation(RequestMapping.class);
23             if (declaredAnnotation != null) {
24                 //获取类URL
25                 String urlStarts = declaredAnnotation.value()[0];
26                 //处理方法URL
27                 if(urlStarts == null) {
28                     urlStarts = "/"+str+"/";
29                 }
30                 if(!urlStarts.startsWith("/")) {//处理前缀
31                     urlStarts = "/"+urlStarts;
32                 }
33                 if(!urlStarts.endsWith("/")) {//处理后缀
34                     urlStarts = urlStarts+"/";
35                 }
36                 for (Method method : forName.getDeclaredMethods()) {
37                     //过滤没有添加 @IgnoreLogin的请求
38                     IgnoreLogin ignoreLogin = method.getAnnotation(IgnoreLogin.class);
39                     if(ignoreLogin == null) {continue; }
40                     //获取方法URL
41                     String urlEnd = "".intern();
42                     for(;;) {// 暂时就这些,需要再加
43                         RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
44                         if (requestMapping != null) {
45                             urlEnd = requestMapping.value()[0];
46                             break;
47                         }
48                         GetMapping getMapping = method.getAnnotation(GetMapping.class);
49                         if (getMapping != null) {
50                             urlEnd = getMapping.value()[0];
51                             break;
52                         }
53                         PostMapping postMapping = method.getAnnotation(PostMapping.class);
54                         if (postMapping != null) {
55                             urlEnd = postMapping.value()[0];
56                             break;
57                         }
58                         PutMapping putMapping = method.getAnnotation(PutMapping.class);
59                         if (putMapping != null) {
60                             urlEnd = putMapping.value()[0];
61                             break;
62                         }
63                         DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
64                         if (deleteMapping != null) {
65                             urlEnd = deleteMapping.value()[0];
66                             break;
67                         }
68                     }
69                     //处理方法URL
70                     if(urlEnd == null) {
71                         urlEnd = method.getName();
72                     }
73                     if(urlEnd.startsWith("/")) {//处理前缀
74                         urlEnd = urlEnd.substring(1);
75                     }
76                     //处理 urlEnd 的 {}   不考虑 {123}id 的情况
77                     if(urlEnd.indexOf("{")>=0) {
78                         String[] split = urlEnd.split("/");
79                         for (String s : split) {
80                             if(s.startsWith("{")) {
81                                 s = "*";
82                             }
83                         }
84                         urlEnd = String.join("/",split);
85                     }
86                     //存入请求忽略列表
87                     if(StringUtils.isEmpty(properties.getAnonUris())) {
88                         properties.setAnonUris(urlStarts+urlEnd);
89                     } else {
90                         properties.setAnonUris(properties.getAnonUris()+StringConstant.COMMA+urlStarts+urlEnd);
91                     }
92                 }
93             }
94         }
95     }
代码如下

 

posted on 2021-08-03 16:21  instr  阅读(58)  评论(0编辑  收藏  举报

导航