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

So passen Sie die Routing-Abdeckung in SpringBoot an

王林
Freigeben: 2023-05-10 16:43:13
nach vorne
1426 Leute haben es durchsucht

    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 "";
      }
      Nach dem Login kopieren
    • 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);
          }
      }
      Nach dem Login kopieren

      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);
              }
          }
      }
      Nach dem Login kopieren

    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!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage