sirve requestmapping que para mvc modelo ejemplo arquitectura java spring spring-mvc controller

java - requestmapping - para que sirve spring mvc



¿Cómo encontrar todos los controladores en Spring MVC? (2)

Para proporcionar alguna documentación de API generada en tiempo de ejecución, quiero iterar sobre todos los controladores Spring MVC. Todos los controladores están anotados con la anotación Spring @Controller. Actualmente lo hago así:

for (final Object bean: this.context.getBeansWithAnnotation( Controller.class).values()) { ...Generate controller documentation for the bean... }

Pero la primera llamada de este código es EXTREMADAMENTE lenta. Me pregunto si Spring itera sobre TODAS las clases en el classpath en lugar de simplemente verificar los beans definidos. Los controladores ya están cargados cuando se ejecuta el código anterior, el registro muestra todos ellos con sus asignaciones de solicitudes, por lo que Spring MVC ya debe conocerlos todos y debe haber una forma más rápida de obtener una lista de ellos. ¿Pero cómo?


Me gusta el enfoque sugerido por @Japs, pero también me gustaría recomendar un enfoque alternativo. Esto se basa en su observación de que la ruta de clases ya ha sido escaneada por Spring, y de que los controladores y los métodos mapeados de la solicitud están configurados, esta asignación se mantiene en un componente handlerMapping . Si está utilizando Spring 3.1, este componente handlerMapping es una instancia de RequestMappingHandlerMapping, que puede consultar para encontrar el handlerMappedMethods y los controladores asociados, en esta línea (si está en una versión anterior de Spring, debería poder usar un enfoque):

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Controller public class EndpointDocController {  private final RequestMappingHandlerMapping handlerMapping;    @Autowired  public EndpointDocController(RequestMappingHandlerMapping handlerMapping) {   this.handlerMapping = handlerMapping;  }     @RequestMapping(value="/endpointdoc", method=RequestMethod.GET)  public void show(Model model) {   model.addAttribute("handlerMethods", this.handlerMapping.getHandlerMethods());  } }

He proporcionado más detalles sobre esto en esta url http://biju-allandsundry.blogspot.com/2012/03/endpoint-documentation-controller-for.html

Esto se basa en una presentación sobre Spring 3.1 de Rossen Stoyanchev de Spring Source.


También he encontrado ese requisito antes de algunos meses y lo he logrado utilizando el siguiente fragmento de código.

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class)); for (BeanDefinition beanDefinition : scanner.findCandidateComponents("com.xxx.yyy.controllers")){ System.out.println(beanDefinition.getBeanClassName()); }

También puedes hacer algo como esto con tus controladores.

Actualizado el fragmento de código. Se eliminó el código no necesario y solo se muestra el nombre de clase de los controladores para una mejor comprensión. Espero que esto te ayude. Aclamaciones.