zoukankan      html  css  js  c++  java
  • 【spring】【spring mvc】【spring boot】获取spring cloud项目中所有spring mvc的请求资源

    实现的方法:

    1.在父级项目中 或者 每个微服务都引用的项目中添加实体类Resource

    2.在父级项目中 或者 每个为服务都引用的项目中写一个工具类,作用是用来获取请求资源

    3.在每一个微服务的启动类添加注解@RestController ,并且写一个请求方法调用 工具类的请求资源的方法

    4.将获取到的JSON字符串 保存在文件中

    5.最后,在需要存储这些信息到数据库中的对应微服务 提供一个请求方法,参数就传递这一个一个的JSON字符串,而请求方法做的事情就是解析JSON,并批量保存到对应数据表中

    1.先提供一个状态这些结果的实体Resource.java

    package com.pisen.cloud.luna.core.utils.beans;
    
    
    
    
    public class Resource {
    
    
        public static final Integer GET_RESOURCE = 1;
    
        public static final Integer OTHER_RESOURCE = 2;
    
        public static final Integer ENABLE = 1;//启用
    
        public static final Integer DISENABLE = 0;//禁用
    
    
        private String path;//资源URL
    
        private String name;//资源名
    
        private String msName;//资源所属微服务
    
        private Integer type;//资源类型 1代表数据资源 2代表功能资源
    
        private Integer enable;//是否启用 0 禁用 1 启用
    
        private String user;//资源被使用对象
    
        private String remark;//资源备注
    
    
        public String getPath() {
            return path;
        }
    
        public void setPath(String path) {
            this.path = path;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMsName() {
            return msName;
        }
    
        public void setMsName(String msName) {
            this.msName = msName;
        }
    
        public Integer getType() {
            return type;
        }
    
        public void setType(Integer type) {
            this.type = type;
        }
    
        public String getUser() {
            return user;
        }
    
        public void setUser(String user) {
            this.user = user;
        }
    
        public String getRemark() {
            return remark;
        }
    
        public void setRemark(String remark) {
            this.remark = remark;
        }
    
        public Resource(String path, String name, String msName, Integer type, String user, String remark,Integer enable) {
            this.path = path;
            this.name = name;
            this.msName = msName;
            this.type = type;
            this.user = user;
            this.remark = remark;
            this.enable = enable;
        }
    }
    View Code

    2.同样在 所有微服务都能引用到的 地方 提供一个工具类MappingResourceUtil.java

    package com.pisen.cloud.luna.core.utils;
    
    import com.pisen.cloud.luna.core.utils.beans.Resource;
    import com.pisen.cloud.luna.core.utils.beans.ResourceConfig;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.BeanFactoryUtils;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerMapping;
    import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
    import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
    import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class MappingResourceUtil {
    
    
        /**
         * 获取本服务下 所有RequestMapping标记的资源信息
         * @param request
         * @param msName    需要传入ms-name 微服务别名
         * @return
         */
        public static List<Resource> getMappingList(HttpServletRequest request,String msName){
            ServletContext servletContext = request.getSession().getServletContext();
            if (servletContext == null)
            {
                return null;
            }
            WebApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    
            //请求url和处理方法的映射
            List<Resource> requestToMethodItemList = new ArrayList<Resource>();
            //获取所有的RequestMapping
            Map<String, HandlerMapping> allRequestMappings = BeanFactoryUtils.beansOfTypeIncludingAncestors(appContext,
                    HandlerMapping.class, true, false);
    
            for (HandlerMapping handlerMapping : allRequestMappings.values())
            {
                //本项目只需要RequestMappingHandlerMapping中的URL映射
                if (handlerMapping instanceof RequestMappingHandlerMapping)
                {
                    RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;
                    Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
                    for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet())
                    {
                        RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();
                        HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();
    
                        PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
                        String requestUrl = patternsCondition.getPatterns() != null && patternsCondition.getPatterns().size()>0 ?
                                patternsCondition.getPatterns().stream().collect(Collectors.toList()).get(0).toString() : null;
    
                        RequestMethodsRequestCondition methodCondition = requestMappingInfo.getMethodsCondition();
                        String requestType = methodCondition.getMethods() != null && methodCondition.getMethods().size()>0 ?
                                methodCondition.getMethods().stream().collect(Collectors.toList()).get(0).toString() : null;
    
                        if (requestType == null){
                            continue;
                        }
    
                        String controllerName = mappingInfoValue.getBeanType().toString();
                        String requestMethodName = mappingInfoValue.getMethod().getName();
                        Class<?>[] methodParamTypes = mappingInfoValue.getMethod().getParameterTypes();
    
                        String name = getResourceName(requestType,requestMethodName);
                        Integer type = getType(requestType);
                        String path = msName+":"+requestUrl;
                        String user = getUser(requestUrl);
                        Integer enable = Resource.ENABLE;
                        Resource resource = new Resource(path,name,msName,type,user,null,enable);
    
                        requestToMethodItemList.add(resource);
                    }
                    break;
                }
            }
    
            return requestToMethodItemList;
        }
    
        /**
         * GET 代表数据资源 1
         * 其他 代表功能资源 2
         * @param type
         * @return
         */
        public static Integer getType(String type){
            return "GET".equals(type) ? Resource.GET_RESOURCE : Resource.OTHER_RESOURCE;
        }
    
        /**
         * 按照请求地址和请求方法 获取资源名称
         * @param requestType
         * @param requestMethodName
         * @return
         */
        public static String getResourceName(String requestType,String requestMethodName){
            requestMethodName = requestMethodName.toLowerCase();
            if ("GET".equals(requestType)){
                return ResourceConfig.GET+requestMethodName;
            }else{
                if (requestMethodName.contains("page")){
                    return ResourceConfig.PAGE+requestMethodName;
                }
                if(requestMethodName.contains("list")){
                    return ResourceConfig.GET+requestMethodName+ResourceConfig.LIST;
                }
                if (requestMethodName.contains("insert")){
                    return ResourceConfig.INSERT+requestMethodName;
                }
                if (requestMethodName.contains("delete")){
                    return ResourceConfig.DELETE+requestMethodName;
                }
                if (requestMethodName.contains("update")){
                    return ResourceConfig.UPDATE+requestMethodName;
                }
                if (requestMethodName.contains("add")){
                    return ResourceConfig.ADD+requestMethodName;
                }
                if (requestMethodName.contains("enable")){
                    return ResourceConfig.ENABLE+requestMethodName;
                }
                if (requestMethodName.contains("init")){
                    return ResourceConfig.INIT+requestMethodName;
                }
                if (requestMethodName.contains("verify")){
                    return ResourceConfig.VERIFY+requestMethodName;
                }
                if (requestMethodName.contains("find")){
                    return ResourceConfig.FIND+requestMethodName;
                }
    
                return requestMethodName;
    
            }
        }
    
        /**
         * 获取资源使用者身份
         * @param requestUrl
         * @return
         */
        public static String getUser(String requestUrl){
            if (StringUtils.isNotBlank(requestUrl)){
    
                String[] pathArr = requestUrl.split("/");
    
                if (pathArr.length > 0 ){
                    if ("ten".equals(pathArr[1])){
                        return ResourceConfig.USER_TEN;
                    }
                    if ("admin".equals(pathArr[1])) {
                        return ResourceConfig.USER_ADMIN;
                    }
                    if ("member".equals(pathArr[1])){
                        return ResourceConfig.USER_MEMBER;
                    }
                    if ("free".equals(pathArr[1])){
                        return ResourceConfig.USER_FREE;
                    }
                    if ("dealer".equals(pathArr[1])){
                        return ResourceConfig.USER_DEALER;
                    }
                }
            }
            return "未知使用者";
    
        }
    
    }
    View Code

    以及一个配置类:ResourceConfig.java

    package com.pisen.cloud.luna.core.utils.beans;
    
    public class ResourceConfig {
    
        //资源名说明关键字
       public final static String GET = "获取";
        public final static String INIT = "初始化操作";
        public final static String VERIFY = "校验";
        public final static String DELETE = "删除操作";
        public final static String PAGE = "分页查询";
        public final static String INSERT = "插入操作";
        public final static String FIND = "查找";
        public final static String UPDATE = "更新操作";
        public final static String ENABLE = "启用判断";
        public final static String ADD = "添加操作";
        public final static String LIST = "集合";
    
    
        //各微服务网关别名
    
        public final static String MS_ACCOUNT = "ms-account";
        public final static String MS_ADMIN = "ms-admin";
        public final static String MS_DEALER = "ms-dealer";
        public final static String MS_EVENT_CENTER = "ms-event-center";
        public final static String MS_GOODS = "ms-goods";
        public final static String MS_INTEGRAL = "ms-integral";
        public final static String MS_MEMBER = "ms-member";
        public final static String MS_CODE = "ms-code";
        public final static String MS_TEN = "ms-ten";
        public final static String MS_ZHONGQI = "ms-zhongqi";
        public final static String MS_PAPER = "ms-paper";
        public final static String MS_TASK_LIST = "ms-task-list";
    
        //各使用者角色
       public final static String USER_ADMIN = "管理员";
       public final static String USER_TEN = "租户";
       public final static String USER_DEALER = "经销商";
       public final static String USER_FREE = "所有人";
       public final static String USER_MEMBER = "会员";
    
    
    
    }
    View Code

    3.然后就可以在每一个微服务的启动类上加注解,加下面这段代码,然后启动这个微服务,访问就能拿到这个微服务下的所有请求资源 为一个JSON字符串了

    举个例子,我现在获取这个微服务的所有请求资源:【红色部分就是 任意粘贴到每一个启动类的代码】【紫色部分就是需要更改的每一个不同微服务的不同服务名】

    package pisen.cloud.luna.ms.account;
    
    import com.alibaba.fastjson.JSON;
    import com.pisen.cloud.luna.core.result.AjaxResult;
    import com.pisen.cloud.luna.core.utils.MappingResourceUtil;
    
    import com.pisen.cloud.luna.core.utils.beans.Resource;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.feign.EnableFeignClients;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableFeignClients
    @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的
    @RestController
    public class PisenLunaMSAccountApp {
        
        public static void main(String[] args) {
    //        String str = MappingResourceUtil.getMappingList(PisenLunaMSAccountApp.class);
    
            SpringApplication.run(PisenLunaMSAccountApp.class, args);
        }
    
        @RequestMapping("/test/index")
        public AjaxResult<String> getAccout(HttpServletRequest request){
            AjaxResult<String> result = new AjaxResult<>();
            List<Resource> list = MappingResourceUtil.getMappingList(request,"ms-account");
    
            String account = JSON.toJSONString(list);
    
            result.initTrue(account);
            return result;
        }
    }

    然后启动本微服务后,postman请求即可:

    4.将请求到的  JSON字符串,保存下来一会用

    使用postman请求下来的字符串 如上 会有

    保存下来如下:

    记得最后在编辑器中将全部替换掉 否则 JSON转化会出问题

    在sublime text中 

    将所有的"替换成 "即可

     替换完成 内容如下:

    5.最后,在想要将这些JSON字符串转化为数据库数据的微服务中,提供一个批量插入的方法,然后将JSON字符串当作参数传入即可[controller中的请求方法]

    @Override
        @RequestMapping("batchInsert2")
        public AjaxResult<List<Resource>> batchInsert2(@RequestBody String  json) {
            AdminUser adminUser = AdminUser.createFeignUser("insert-resource");
            String adminUid = adminUser.getUid();
            AjaxResult<List<Resource>> res = new AjaxResult<>();
            json = JSONObject.parseObject(json).getString("json");
            List<Resource> list = JSONArray.parseArray(json,Resource.class);
            for (Resource resource : list) {
                resource.setEnabledFlag(1);
                resource.setUid(LunaIDUtil.uid());
                resource.setCreateDate(new Date());
                resource.setUpdateDate(new Date());
                resource.setUpdateId(adminUid);
                resource.setCreateId(adminUid);
                resource.setUrl(resource.getPath());
            }
            sysUserService.batchInsert(list);
            res.initTrue(list);
            return res;
        }

    Resource如下:

    package com.pisen.cloud.luna.ms.tenement.base.domain;
    
    import javax.persistence.*;
    import java.util.Date;
    
    
    @Entity
    @Table(uniqueConstraints = {
            @UniqueConstraint(columnNames = "uid")
    })
    public class Resource {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;// 主键 自增
    
        @Column(nullable = false)
        private String uid; //业务主键
    
        @Column(nullable = false, updatable = false)
        private Date createDate = new Date();// 创建时间
    
        @Column(nullable = false)
        private Date updateDate = new Date();// 修改时间
    
        @Column(nullable = false)
        private String createId;// 创建人id
    
        @Column(nullable = false)
        private String updateId;// 修改人id
    
        private Integer enabledFlag;// 是否启用 1启用 0禁用
    
        private String remark;// 备注
    
        private String name;//资源名
    
        private String url;//资源URL
    
        private String path;// 资源URL
    
        private String msName;//资源所属微服务
    
        private Integer type;//资源类型 1代表数据资源 2代表功能资源
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUid() {
            return uid;
        }
    
        public String getPath() {
            return path;
        }
    
        public void setPath(String path) {
            this.path = path;
        }
    
        public void setUid(String uid) {
            this.uid = uid;
        }
    
        public Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
    
        public Date getUpdateDate() {
            return updateDate;
        }
    
        public void setUpdateDate(Date updateDate) {
            this.updateDate = updateDate;
        }
    
        public String getCreateId() {
            return createId;
        }
    
        public void setCreateId(String createId) {
            this.createId = createId;
        }
    
        public String getUpdateId() {
            return updateId;
        }
    
        public void setUpdateId(String updateId) {
            this.updateId = updateId;
        }
    
        public Integer getEnabledFlag() {
            return enabledFlag;
        }
    
        public void setEnabledFlag(Integer enabledFlag) {
            this.enabledFlag = enabledFlag;
        }
    
        public String getRemark() {
            return remark;
        }
    
        public void setRemark(String remark) {
            this.remark = remark;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getMsName() {
            return msName;
        }
    
        public void setMsName(String msName) {
            this.msName = msName;
        }
    
        public Integer getType() {
            return type;
        }
    
        public void setType(Integer type) {
            this.type = type;
        }
    }
    View Code

    批量插入方法 使用JPA的save()即可,使用mybatis的批量插入也可以

    使用postman请求地址如下:【注意请求的格式,post请求,参数格式也需要注意】

     

    完成!!!!!!!

    ===========================================================================================

    收集到另外一种方法,更简单:

    直接在controller中加上一个方法,请求即可:

    @RequestMapping(value="getUrlMapping")
        public Object getUrlMapping(HttpServletRequest request) {
            WebApplicationContext wc = getWebApplicationContext(request.getSession().getServletContext());
            RequestMappingHandlerMapping rmhp = wc.getBean(RequestMappingHandlerMapping.class);
            Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods();
            for (Iterator<RequestMappingInfo> iterator = map.keySet().iterator(); iterator
                    .hasNext();) {
                RequestMappingInfo info = iterator.next();
                System.out.println(info.getConsumesCondition());
                System.out.println(info.getCustomCondition());
                System.out.println(info.getHeadersCondition());
                System.out.println(info.getMethodsCondition());
                System.out.println(info.getParamsCondition());
                System.out.println(info.getPatternsCondition());
                System.out.println(info.getProducesCondition());
    
                System.out.println("===");
    
                HandlerMethod method = map.get(info);
                System.out.println(method.getMethod().getName() + "--");
                System.out.println();
            }
            return null;
        }
  • 相关阅读:
    man LVCREATE
    Pyhton---基础---递归
    Python---基础---循环,函数
    Python---基础---dict_tuple_set
    Python---基础---dict和set2
    安卓网络编程学习(1)——java原生网络编程(1)
    使用python爬取B站弹幕和三连
    maven项目整合工具学习
    读阿里巴巴泰山版《java开发手册》总结(2)
    第十三周学习进度
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9337697.html
Copyright © 2011-2022 走看看