java Spring mvc 自动装配 RequestMappingHandlerMapping
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31893335/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring mvc autowire RequestMappingHandlerMapping
提问by Petr Sadf
I'm trying to autowire org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
in my spring mvc controller in order to get all url mappings and display them on UI, but not successfull. There is error that the bean is missing:
我正在尝试org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
在我的 spring mvc 控制器中自动装配以获取所有 url 映射并将它们显示在 UI 上,但没有成功。有错误,bean 丢失:
org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping web.controller.WorkController.handlerMapping; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
My web.xml:
我的 web.xml:
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
My mvc-dispatcher-servlet.xml:
我的 mvc-dispatcher-servlet.xml:
<context:annotation-config/>
<context:component-scan base-package="web.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
My root-context.xml:
我的根上下文.xml:
<bean id="helloBean" class="web.beans.HelloBean"/>
The java controller:
java控制器:
package web.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import web.beans.HelloBean;
import java.util.List;
@Controller
public class WorkController {
@Autowired RequestMappingHandlerMapping handlerMapping;
@Autowired private HelloBean helloBean;
@Autowired private ApplicationContext applicationContext;
@RequestMapping(value = "/index")
public String index() {
return "index";
}
}
回答by Dmitriy
You should initiate the RequestMappingHandlerMapping bean before autowired it. It has two way:
您应该在自动装配它之前启动 RequestMappingHandlerMapping bean。它有两种方式:
- In springxml config such as hello bean
- 在 springxml 配置中,例如 hello bean
<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> <!-- add your properties here property name="..." value="..."></property--> </bean>
<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> <!-- add your properties here property name="..." value="..."></property--> </bean>
Or using
@Configuration
@Configuration @ComponentScan("your.package") @EnableWebMvc public class AppConfig { ... @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping(); // add properties here return mapping; } ... }
或使用
@配置
@Configuration @ComponentScan("your.package") @EnableWebMvc public class AppConfig { ... @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping(); // add properties here return mapping; } ... }
回答by Javy
Try to get all request urls
, The code below may be useful for you.
尝试获取所有请求urls
,下面的代码可能对您有用。
ServletContext servletContext = request.getSession().getServletContext();
WebApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
Map<String, HandlerMapping> allRequestMappings = BeanFactoryUtils.beansOfTypeIncludingAncestors(appContext, HandlerMapping.class, true, false);
for (HandlerMapping handlerMapping : allRequestMappings.values()) {
if (handlerMapping instanceof RequestMappingHandlerMapping) {
RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet()) {
RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();
PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
String requestUrl = SetUtils.first(patternsCondition.getPatterns());
System.out.println(requestUrl);
}
}
}
Frankly speaking, java reflect
is a key point to get all request urls
. if you look into the spring-mvc source deeply, you will find the implementation classes
of HandlerMapping
interface, such as
坦白说,java reflect
是获取所有请求的关键点urls
。如果你深入查看spring-mvc源码,你会发现implementation classes
of HandlerMapping
接口,比如
AbstractControllerUrlHandlerMapping, AbstractDetectingUrlHandlerMapping,
AbstractHandlerMapping, AbstractHandlerMethodMapping,
AbstractUrlHandlerMapping, BeanNameUrlHandlerMapping,
ControllerBeanNameHandlerMapping, ControllerClassNameHandlerMapping,
DefaultAnnotationHandlerMapping, RequestMappingHandlerMapping,
RequestMappingInfoHandlerMapping, SimpleUrlHandlerMapping
回答by Santonio
- i try to add "@EnableWebFlux" in my Main class and it works(in my situation).
- so i think maybe "EnableWebMvc" works so..
- it works fine for me, don`t ↓ me please :)
- 我尝试在我的主类中添加“ @EnableWebFlux”并且它有效(在我的情况下)。
- 所以我想也许“ EnableWebMvc”可以这样工作..
- 它对我来说很好用,请不要↓我:)
@EnableWebFlux(for webflux)
@EnableWebMvc(for commvc)
@SpringBootApplication
public class InstoreApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(InstoreApplication.class)......
}
}