Heim  >  Artikel  >  Java  >  So passen Sie die Routing-Abdeckung in SpringBoot an

So passen Sie die Routing-Abdeckung in SpringBoot an

王林
王林nach vorne
2023-05-10 16:43:131309Durchsuche

    Hintergrund

    Das Unternehmen hat kürzlich ein Projekt in der zweiten Phase, das die Transformation einiger Funktionen erfordert, was die personalisierte Anpassung einiger der integrierten Geschäftsschnittstellen des Frameworks, die Kompatibilität mit alten Schnittstellenfunktionen und die Ergänzung umfasst Aufgrund der Verteilung einiger Front-End-Aufrufe auf diese Schnittstellen gibt es viele und Fragmente, und die Kosten für Modifikation und Tests sind hoch. Daher planen wir, Routing-Abdeckungsfunktionen auf Framework-Ebene bereitzustellen, um dies zu beschleunigen Projektfortschritt und Reduzierung der Systemrisiken, die durch nichttechnische Änderungen verursacht werden

    Registrieren Sie die Konfigurationsklasse für die benutzerdefinierte Routenzuordnung.
    • Implementierung Schlüssel-Wert-Paar zuordnen
    • @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Inherited
      public @interface CoverRoute {
          String value() default "";
      }
    • Angepasstes RequestMappingHandlerMapping

      Erbt RequestMappingHandlerMapping, schreibt die Methode „lookupHandlerMethod“ neu und überschreibt sie, wenn Spring die Routenadressierung durchführt overRoute-Annotation in der personalisierten Schnittstellenklasse Geben Sie die abzudeckende Routing-Adresse an und erstellen Sie den gleichen Routing-Pfad. Der Zugriff auf die ursprüngliche Schnittstellenadresse wird automatisch an die personalisierte Schnittstellenadresse des Projekts weitergeleitet.
    • Originalschnittstelle

      public class ConverRouteUtil {
          private static HashMap<String, String> mappingRegist = new HashMap<>();
          public static void initRoute(Class runtimeClass, List<String> extraPackageNameList) {
              List<Class<?>> scanClassList = new ArrayList<>();
              if (!runtimeClass.getPackage().getName().equals(Application.class.getPackage().getName())) {
                  scanClassList.addAll(ScanUtil.getAllClassByPackageName_Annotation(runtimeClass.getPackage(), CoverRoute.class));
              }
              for (String packageName : extraPackageNameList) {
                  scanClassList.addAll(ScanUtil.getAllClassByPackageName_Annotation(packageName, CoverRoute.class));
              }
              for (Class clazz : scanClassList) {
                  CoverRoute coverRoute = (CoverRoute) clazz.getAnnotation(CoverRoute.class);
                  if (StringUtil.isEmpty(coverRoute.value())) {
                      continue;
                  }
                  RequestMapping requestMapping = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
                  String classRoute = "";
                  if (requestMapping != null) {
                      classRoute = requestMapping.value()[0];
                  } else {
                      continue;
                  }
                  List<Method> methodList = Arrays.asList(clazz.getDeclaredMethods());
                  for (Method method : methodList) {
                      PostMapping postMapping = method.getAnnotation(PostMapping.class);
                      String methodRoute = "";
                      if (postMapping != null) {
                          methodRoute = postMapping.value()[0];
                      } else {
                          GetMapping getMapping = method.getAnnotation(GetMapping.class);
                          if (getMapping != null) {
                              methodRoute = getMapping.value()[0];
                          }
                      }
                      if (!StringUtil.isEmpty(classRoute) && !StringUtil.isEmpty(methodRoute)) {
                          String orginalRoute = coverRoute.value() + methodRoute;
                          String redirectRoute = classRoute + methodRoute;
                          mappingRegist.put(orginalRoute, redirectRoute);
                      }
                  }
              }
              if (mappingRegist.size() > 0) {
                  System.out.println("扫描路由方法覆盖:" + mappingRegist.size() + "个");
              }
          }
          public static boolean checkExistCover(String orginalRoute) {
              return mappingRegist.containsKey(orginalRoute);
          }
          public static String getRedirectRoute(String orginalRoute) {
              return mappingRegist.get(orginalRoute);
          }
      }

      Neue Schnittstelle
    • public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
          @Override
          protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception {
              if(ConverRouteUtil.checkExistCover(lookupPath)){
                  String redirectRoute = ConverRouteUtil.getRedirectRoute(lookupPath);
                  request.setAttribute("redirectTag","1");
                  request.setAttribute("redirectRoute",redirectRoute);
                  request.setAttribute("lookupPath",lookupPath);
                  lookupPath = redirectRoute;
              }else{
                  request.setAttribute("redirectTag","0");
              }
              return super.lookupHandlerMethod(lookupPath, request);
          }
          @Override
          protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) {
              String redirectTag = ConvertOp.convert2String(request.getAttribute("redirectTag"));
              if(redirectTag.equals("1")){
                  String redirectRoute = ConvertOp.convert2String(request.getAttribute("redirectRoute"));
                  boolean check = false;
                  if( info.getPatternsCondition()!=null){
                      Set<String> set =  info.getPatternsCondition().getPatterns();
                      if(set.size()>0){
                          String[] array = new String[set.size()];
                          array = set.toArray(array);
                          String pattern = array[0];
                          if(pattern.equals(redirectRoute)){
                              check = true;
                          }
                      }
                  }
                  if(check){
                      return info;
                  }else{
                      return super.getMatchingMapping(info, request);
                  }
              }else{
                  return super.getMatchingMapping(info, request);
              }
          }
      }

    Das obige ist der detaillierte Inhalt vonSo passen Sie die Routing-Abdeckung in SpringBoot an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen