spring boot swagger文档参数解析扩展

前言:swagger是一个功能比较强大的接口文档工具,项目中很多接口对接直接使用swagger就可以了,但是有些场合并不适用,比如说要获取swagger里面的特定字段进行扩展,就不是很方便。简单的介绍下扩展swagger的思路,每个版本的差异较大,现已2.7.0做介绍。

1、获取swagger接口文档提供的数据

Documentation documentation = ac.getBean(DocumentationCache.class).documentationByGroup("default");
Swagger swagger = ac.getBean(ServiceModelToSwagger2Mapper.class).mapDocumentation(documentation);

2、通过path获取详细的请求信息

private RequestEntity getRequestDetails(JSONObject path) throws IllegalAccessException {
		//Iterator<Map.Entry<String,Object>> it =path.entrySet().iterator();
		JSONObject  jsonObject =path.getJSONObject("operationMap");
		Iterator<Map.Entry<String,Object>> it =jsonObject.entrySet().iterator();

		String type ="";
		String typebak="";
		while(it.hasNext()){
			Map.Entry<String,Object> entry = it.next();
			ReqType[] reqTypes = ReqType.values();
			for(int i = 0; i< reqTypes.length; i++){
				String key =entry.getKey().toString();
				if(key.equals(reqTypes[i].getType())&&entry.getValue()!=null){
					if("".equals(type)){
						type+=key;
					}else{
						type+="/"+key;
					}
					JSONObject jsonObject1 = (JSONObject)entry.getValue();
				//	typebak =key;
						typebak =key;

				}
			}
		}
		//typebak="POST";
		typebak=type.split("/")[0];

		RequestEntity requestEntity =  new RequestEntity();
		requestEntity.setRequestType(type);
	//	requestEntity.setOperation((Map)path.get(typebak));
		requestEntity.setOperation((Map)jsonObject.get(typebak));

		return requestEntity;
	}

3、获取请求参数

private List<Object> getRequestParameters(JSONObject definition,JSONArray parameters){
		List<Object> reqList = new ArrayList<Object>();//返回请求的参数数据封装实体
		RequestParamEntity isReq = new RequestParamEntity(true);

		List isListMap = new ArrayList();
		List<DefEntity> list =changeDefinction(definition);
		for(int i=0;i<parameters.size();i++){//遍历请求的参数
			ParamEntity p = changeParameter((JSONObject) parameters.get(i));//将每个请求参数里面所需数据进行封装 成ParamDto
			Object object =null;
			if(DataType.MAP.getType().equals(p.getType())){//对每个ParamDto里面数据进行类型判断,处理并返回我们所需要的组合的json格式实体
				object = new HashMap();
			}else if(DataType.LIST.getType().equals(p.getType())){
				if(p.getRef()==null){
					List lista = new ArrayList();
					lista.add(new HashMap());
					//object = new ArrayList();
					object = lista;
				}else{
					List list1 = new ArrayList();
					list1.add(getRec(p,definition));
					object = list1;
				}
			}else{
				if(p.getRef()!=null){//实体引用
					object = getRec(p,definition);
					if(!(object instanceof Map)){
						Map map = new HashMap();
						map.put(p.getName(),p.getRef());
						object =map;
					}
				}else {//
					Map map = new HashMap();
					map.put(p.getName(),p.getType());
					object =map;
				}
			}
			reqList.add(object);
		}
		return reqList;
	}

4、definetions转List<def>

private List<DefEntity> changeDefinction(JSONObject definitions){
		Iterator<Map.Entry<String,Object>> it = definitions.entrySet().iterator();
		List<DefEntity> defDtoList = new ArrayList<DefEntity>();
		// 遍历每个definction
		while(it.hasNext()){
			Map.Entry<String,Object> entry=it.next();
			DefEntity defDto = new DefEntity();
			defDto.setProDto(entry.getKey());
			defDto.setType(entry.getKey());
			JSONObject model = (JSONObject) entry.getValue();
			JSONObject map = (JSONObject) model.get(SystemConstant.PROPERTIES);
			Iterator<Map.Entry<String,Object>> it2 =null;
			if(map!=null){
				it2= map.entrySet().iterator();
			} else{
				//为空意味着是map类型,map类型我们不做处理
				continue;
			}
			//遍历每个definction的属性
			List<ItemEntity> itemDtos = new ArrayList<ItemEntity>();
			while(it2.hasNext()){
				Map.Entry<String,Object> entry1 =it2.next();
				ItemEntity itemDto = new ItemEntity();
				itemDto.setName(entry1.getKey());
				JSONObject pmap= (JSONObject)entry1.getValue();
				String op=null;
				if(pmap!=null){
					itemDto.setType((String)pmap.get(SystemConstant.TYPE));
					op = (String)pmap.get(SystemConstant.SIMPLEREF);
				}
				if(DataType.MAP.getType().equals((String)pmap.get(SystemConstant.TYPE))){
					Map addMap = (Map)pmap.get(SystemConstant.ADDITIONPROPERTIES);
					if(addMap == null){
						//为null意味着自定义是Object,跳过
						itemDto.setType(DataType.MAP.getType());
					}
					else{//map
						Object  addRef = addMap.get(SystemConstant.SIMPLEREF);
						if(addRef!=null){
							itemDto.setRef(addRef.toString());
							itemDto.setType(DataType.MAP.getType());
						}
						itemDto.setType(DataType.MAP.getType());
					}
				} else if (DataType.LIST.getType().equals((String)pmap.get(SystemConstant.TYPE))) {
					Map itMap=(Map)pmap.get(SystemConstant.ITEMS);
					Object oIt =itMap.get(SystemConstant.SIMPLEREF);
					if(oIt!=null){
						itemDto.setRef(oIt.toString());
					//	itemDto.setType(DataType.LIST.getType());
					}else{
						itemDto.setRef((String)itMap.get(SystemConstant.TYPE));

					}
					itemDto.setType(DataType.LIST.getType());
				}else if(op!=null){
					itemDto.setRef(op.toString());
					itemDto.setType(op.toString());
				}
				String format = (String)pmap.get(SystemConstant.FORMAT);
				if(format!=null &&format.equals(SystemConstant.DATETIME)){
					itemDto.setType(format);
				}
				itemDtos.add(itemDto);
			}
			defDto.setItem(itemDtos);
			defDtoList.add(defDto);
		}
		return defDtoList;
	}

5、递归ref指向的对象转Map

private Map<String,Object> ite(String ref,JSONObject definition){
		List<DefEntity> defEntitys =changeDefinction(definition);
		Map<String,Object> map = new HashMap<String, Object>();
		if(ref!=null){
//             遍历整个Swagger引用的所有对象,即定义对象,并递归调用组合对象属性的引用对应的实体返回实体类
			for(int i=0;i<defEntitys.size();i++){
				DefEntity defEntity = defEntitys.get(i);
//                  引用的定义对象
				if(ref.equals(defEntity.getProDto())){
					List<ItemEntity> itemDtos =defEntity.getItem();
//                       定义对象的属性
					for(int j=0;j<itemDtos.size();j++){
						ItemEntity itemDto =itemDtos.get(j);
						String iteRef=itemDto.getRef();
						if(iteRef!=null){
							if(DataType.MAP.getType().equals(itemDto.getType())){
								map.put(itemDto.getName(),new HashMap());
							}else if(DataType.LIST.getType().equals(itemDto.getType())){
								Map<String,Object> map1 = ite(iteRef,definition);
								List list1 =new ArrayList();
//								list的引用为空将存放的类型为基本类型或者Object,匹配不到,把类型名放入
								if(map1.size()==0 && iteRef!=null){
									if(iteRef.equals(DataType.MAP.getType())){
										list1.add(new HashMap());
									}else{
										list1.add(iteRef);
									}
								}
								else{
									list1.add(map1);
								}
								map.put(itemDto.getName(),list1);
							}else{
								Map<String,Object> map2 = ite(iteRef,definition);
								map.put(itemDto.getName(),map2);   ;
							}
						}else{
							if(DataType.MAP.getType().equals(itemDto.getType())){
								map.put(itemDto.getName(),new HashMap());
							}else if(DataType.LIST.getType().equals(itemDto.getType())){
								map.put(itemDto.getName(),new ArrayList());
							}else{
								map.put(itemDto.getName(),itemDto.getType());
							}

						}
					}
					break;
				}
			}
		}
		// logger.info("递归{}",JSON.toJSONString(map));
		return map;
	}

6、获取返回参数 与请求参数类似

private Object getResponseParameters(JSONObject definctions,JSONObject response){
		ParamEntity p=changeParameter(response);
		if(DataType.MAP.getType().equals(p.getType())){
			return new HashMap();
		}else if(DataType.LIST.getType().equals(p.getType())){
			if(p.getRef()==null){
				List lista = new ArrayList();
				lista.add(new HashMap());
				//object = new ArrayList();
				return  lista;
			}else{
				List list1 = new ArrayList();
				list1.add(getRec(p,definctions));
				return list1;
			}
		} else{
			if(p.getRef()!=null){
				Object object= getRec(p,definctions);
				if(!(object instanceof Map)){
					Map map = new HashMap();
					map.put(p.getName(),p.getRef());
					object =map;
				}
				return object;
			}else {
				Map map = new HashMap();
				map.put(p.getName(),p.getRef());
				return map;
			}
		}
	}

7、返回每个map的key $ref对应的value的截取值 即引用对象名

private String getRef(Map m){
		try{
			return m.get(SystemConstant.SIMPLEREF).toString();
		}catch(Exception e){
			return null;
		}
	}

8、返回每个map的key $ref是否空

private boolean refIsNull(Map m){
		if(m!=null&&m.get(SystemConstant.SIMPLEREF)!=null && !m.get(SystemConstant.SIMPLEREF).equals("") ){
			return  false;
		}
		return  true;
	}

9、迭代返回map的size = 0时证明找不到引用,那么则返回他的类型

	private Object getRec (ParamEntity paramDto, JSONObject definction){
		Map map =ite(paramDto.getRef(),definction);
		//if(map.size()==0 && !paramDto.getRef().equals(DataType.MAPREF.getType())&&!paramDto.getRef().equals(DataType.LISTREF.getType()) ){
		//&&!DataType.LIST.getType().equals(paramDto.getType())
		if(map.size()==0 && !DataType.MAP.getType().equals(paramDto.getType()) ){
			if(DataType.LIST.getType().equals(paramDto.getType())){
				//return  paramDto.getRef();
				//return  DataType.MAP.getType();
				return  new HashedMap();
			}
			return paramDto.getType();
		}
		return  map;
	}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangchangbin123/article/details/80321964
文章标签: swagger 解析 扩展
所属专栏: springcloud微服务解析
想对作者说点什么? 我来说一句

swagger注解 详细说明

swagger

Amethyst128 Amethyst128

2017-09-11 16:00:36

阅读数:497

没有更多推荐了,返回首页

不良信息举报

spring boot swagger文档参数解析扩展

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭