spring rest项目url规范
用到很多的url,有的不符合规范,需要统计所有url查看哪些不合理,哪些需要改进的。就写了一个小程序来读取Controller的注解来分析rest所用到的url。添加了递归调用的方式,更方便读取。
分析后的结果
package com.lanaya.web.util;
/**
* @author dongbin.yu
* @version 1.0.0
* @since 2015/12/21
*/
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* @author dongbin.yu
* @version 1.0.0
* @since 2015/10/21
*/
public class RequestMappingUtil {
private static String controllerUrl = "com.lanaya.web.controller";
public static void main(String[] args){
URL resource = RequestMappingUtil.class.getClass().getResource("/" + controllerUrl.replace('.','/'));
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File directory = new File(resource.getPath());
if(directory.isDirectory()){
File[] files = directory.listFiles();
for (File file : files) {
System.out.println(exportUrl(file));
}
}
}
public static List<String> exportUrl(File file){
List<String> urlList = new ArrayList<>();
try {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File file1 : files) {
urlList.addAll(exportUrl(file1));
}
} else {
String fileName = file.getName();
Class<?> clazz = Class.forName(controllerUrl + "." + fileName.substring(0, fileName.indexOf(".")));
RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);
String topUrl = "";
if (requestMapping != null) {
topUrl = requestMapping.value()[0];
}
Method[] methods = clazz.getMethods();
for (Method method : methods) {
RequestMapping annotation = method.getAnnotation(RequestMapping.class);
if (annotation != null) {
String methodUrl = annotation.value()[0];
if (methodUrl.startsWith("/")) {
urlList.add(topUrl + methodUrl + ":" + (annotation.method().length == 0 ? RequestMethod.GET : annotation.method()[0]));
} else {
urlList.add(topUrl + File.separator + methodUrl + ":" + (annotation.method().length == 0 ? RequestMethod.GET : annotation.method()[0]));
}
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return urlList;
}
}
通过读取RequestMapping注解和method注解,读取的时候要注意是否在Class头上有前缀。还有是否有层级嵌套。
attributionReport/getAttributionPathList:POST
调用后发现RequestMapping的value和method都是数组,可以接受多个参数的。