Maison >Java >javaDidacticiel >Comment personnaliser la couverture de routage dans SpringBoot
L'entreprise a récemment un projet dans la deuxième phase qui nécessite la transformation de certaines fonctions, ce qui implique la personnalisation de certaines des interfaces métier intégrées au framework, la compatibilité avec les anciennes fonctions d'interface et l'ajout de certains nouveaux retours de données En raison de la distribution des appels frontaux vers ces interfaces, ils sont nombreux et fragmentés, et le coût de modification et de test est élevé, nous prévoyons donc de fournir une fonction de couverture de routage au niveau du framework pour accélérer le retour. progresser le projet et réduire les risques du système causés par des modifications sans contenu technique
Fournir des annotations personnalisées pour spécifier les itinéraires de couverture requis et les nouvelles adresses de routage
Analyser toutes les données d'annotation et effectuer le traitement de cartographie au démarrage du système
Enregistrer la classe de configuration de mappage d'itinéraire personnalisé
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface CoverRoute { String value() default ""; }
La méthode initRoute est appelée au démarrage du système, et l'itinéraire d'origine et l'itinéraire de superposition correspondant sont mappés sur la paire clé-valeur de carte
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); } }
Hérite de RequestMappingHandlerMapping et réécrit la méthode lookupHandlerMethod, et la remplace lorsque Spring effectue l'adressage de route
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); } } }
@Component public class WebRequestMappingConfig implements WebMvcRegistrations { public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = new CustomRequestMappingHandlerMapping(); handlerMapping.setOrder(0); return handlerMapping; } }
Ajoutez l'annotation @CoverRoute dans le interface personnalisée classe, spécifiez l'adresse de routage qui doit être couverte et créez le même chemin de routage. L'accès à l'adresse d'interface d'origine sera automatiquement transmis à l'adresse d'interface personnalisée du projet
Interface d'origine
@Controller @RequestMapping("/example/original") public class RedirectOriginalExampleController { @PostMapping("/getConfig") @ResponseBody @AnonymousAccess public Object getConfig(@RequestBody Map<String, Object> params) { Result result = Result.okResult(); result.add("tag","original"); return result; } }
Nouvelle interface
@Controller @RequestMapping("/example/redirect") @CoverRoute("/example/original") public class RedirectExampleController { @PostMapping("/getConfig") @ResponseBody public Object getConfig(@RequestBody Map<String, Object> params) { Result result = Result.okResult(); String param1 = ConvertOp.convert2String(params.get("param1")); result.add("tag","redirect"); result.add("param1",param1); return result; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!