2017-01-12 11 views
0

В аннотации Spring-MVC @RequestMapping есть параметр «имя», который может использоваться для идентификации каждого ресурса.Spring-MVC: найти информацию о карте по ее названию

Для некоторых случаев мне нужно получить доступ к этой информации на лету: получить данные о карте (например, path) по данному имени.

Конечно, я могу отсканировать для классов для этой аннотации и получить необходимые экземпляры через:

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

Но это довольно некрасиво. Является ли более простым решением?

ответ

3

Вы можете использовать RequestMappingHandlerMapping, чтобы получить все ваши сопоставления и отфильтровать их на основе имени. Ниже приведен фрагмент кода, который создает rest api и возвращает детали пути api/mapping.

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; 
    } 
} 

Выше всего лишь пример, Вы можете использовать RequestMappingHandlerMapping в любом случае вы хотите, пока вы не можете autowire его.

+0

Ницца, спасибо за идею – Andremoniy