在这里校验了一下注解Request中的value的值,如果中间有空格的话会抛出异常。UrlUtils.makeUrl() 这个方法主要是将url中的多余”/”去掉,代码长这个样子:
private static final String SLASH = "https://www.jb51.net/"; /** * 处理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] == 'https://www.jb51.net/') { continue; } if (i == chars.length - 1 && chars[i] == 'https://www.jb51.net/') { 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); } }
最后只要吧init()稍微修改一下就好了,修改完之后是这样的:
/** * 初始化配置 */ @SneakyThrows(IOException.class) protected void init() { String configFileName = applicationName + ".json"; InputStream inputStream = ClassUtils.getClassLoader().getResourceAsStream(configFileName); byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes); String config = new String(bytes, "utf-8"); //应用配置 JSONObject configJson = JSONObject.parseObject(config); //TODO:生成对象的工厂类(先默认为每次都new一个新的对象) this.objectFactory = new AlwaysNewObjectFactory(); //TODO:不同的入参名称获取类(当前默认为asm) urlMethodMappingFactory.setParamNameGetter(new AsmParamNameGetter()); //通过文件配置加载 addApplicationUrlMappingByJsonConfig(configJson); //是否开启注解支持 Boolean annotationSupport = configJson.getBoolean(ANNOTATION_SUPPORT_NODE); Assert.notNull(annotationSupport, ANNOTATION_SUPPORT_NODE + NOT_FIND); if (annotationSupport) { addApplicationUrlMappingByAnnotationConfig(configJson); } }
您可能感兴趣的文章: