在这里校验了一下注解Request中的value的值,如果中间有空格的话会抛出异常。UrlUtils.makeUrl() 这个方法主要是将url中的多余”/”去掉,代码长这个样子:
private static final String SLASH = "/";
/**
* 处理url
* 1:去掉连接中相邻并重复的“/”,
* 2:链接开头没有“/”,则添加。
* 3:链接结尾有“/”,则去掉。
*
* @param url
* @return
*/
public static String makeUrl(@NonNull String url) {
char[] chars = url.toCharArray();
StringBuilder newUrl = new StringBuilder();
if (!url.startsWith(SLASH)) {
newUrl.append(SLASH);
}
for (int i = 0; i < chars.length; i++) {
if (i != 0 && chars[i] == chars[i - 1] && chars[i] == '/') {
continue;
}
if (i == chars.length - 1 && chars[i] == '/') {
continue;
}
newUrl.append(chars[i]);
}
return newUrl.toString();
}
这样通过注解获取UrlMethodMapping的工厂方法就写完了,下面开始修改加载框架的代码。
修改Application中的init
这里因为添加了一种使用注解方式获取UrlMethodMapping的方法,所以新建一个方法:
void addApplicationUrlMappingByAnnotationConfig(JSONObject configJson) 。在这里获取框架配置中的包名以及做一些配置上的校验,代码如下:
/**
* 使用注解来加载UrlMethodMapping
*
* @param configJson
*/
private void addApplicationUrlMappingByAnnotationConfig(JSONObject configJson) {
String annotationPackage = configJson.getString(ANNOTATION_PACKAGE_NODE);
Assert.notNull(annotationPackage, ANNOTATION_PACKAGE_NODE + NOT_FIND);
//获取添加了@Request的类
Set<Class> classes = new HashSet<>();
ClassUtils.getClassByPackage(annotationPackage, classes);
Iterator<Class> iterator = classes.iterator();
while (iterator.hasNext()) {
Class aClass = iterator.next();
List<UrlMethodMapping> mappings = urlMethodMappingFactory.getUrlMethodMappingListByClass(aClass);
if (mappings.size() == 0) {
continue;
}
for (UrlMethodMapping mapping : mappings) {
addApplicationUrlMapping(mapping);
}
}
}
之后把先前写的读取json配置生成urlMappin的代码摘出来,单独写一个方法:
void addApplicationUrlMappingByJsonConfig(JSONObject configJson),这样使代码中的每个方法的功能都独立出来,看起来比较整洁,清楚。代码如下:
/**
* 使用文件配置来加载UrlMethodMapping
* 配置中找不到的话不执行。
*
* @param configJson
*/
private void addApplicationUrlMappingByJsonConfig(JSONObject configJson) {
JSONArray jsonArray = configJson.getJSONArray(MAPPING_NODE);
if (jsonArray == null || jsonArray.size() == 0) {
return;
}
for (int i = 0; i < jsonArray.size(); i++) {
UrlMethodMapping mapping = urlMethodMappingFactory.getUrlMethodMappingByJson(jsonArray.getJSONObject(i));
addApplicationUrlMapping(mapping);
}
}








