2017-01-12 3 views
0

Spring-MVCs @RequestMapping Annotation hat Parameter "Name", der zur Identifizierung jeder Ressource verwendet werden kann.Spring-MVC: Mapping-Details anhand des Namens finden

Für einige Umstände muss ich auf diese Informationen auf Fly zugreifen: Abrufen von Mapping-Details (z. B. path) mit dem angegebenen Namen.

Sure I für die Klassen für diese Anmerkung scannen und benötigte Instanzen über abrufen:

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); 
scanner.addIncludeFilter(new AnnotationTypeFilter(RequestMapping.class)); 
// ... find classes ... go through its methods ... 

Aber es ist ziemlich hässlich. Ist eine einfachere Lösung?

Antwort

3

Sie können RequestMappingHandlerMapping verwenden, um alle Ihre Zuordnungen abzurufen und basierend auf dem Namen zu filtern. Es folgt ein Code-Snippet, das eine Rest-API erstellt und die Pfaddetails einer API/Zuordnung zurückgibt.

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.method.HandlerMethod; 
import org.springframework.web.servlet.mvc.method.RequestMappingInfo; 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; 

@RestController 
public class EndpointController { 

    @Autowired 
    private RequestMappingHandlerMapping handlerMapping; 

    @GetMapping("endpoints/{name}") 
    public String show(@PathVariable("name") String name) { 
     String output = name + "Not Found"; 
     Map<RequestMappingInfo, HandlerMethod> methods = this.handlerMapping.getHandlerMethods(); 

     for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : methods.entrySet()) { 
      if (entry.getKey().getName() != null && entry.getKey().getName().equals(name)) { 
       output = entry.getKey().getName() + " : " + entry.getKey(); 
       break; 
      } 
     } 
     return output; 
    } 
} 

Die oben ist nur ein Beispiel, können Sie die RequestMappingHandlerMapping irgendwie Sie wollen, bis Sie es autowire können.

+0

Schön, danke für die Idee – Andremoniy

Verwandte Themen