作者cyclone350 (老子我最神)
看板java
标题[问题] springMVC取得所有mapping URL
时间Tue Aug 12 17:44:50 2014
大家好
目前在使用 spring MVC, 想做一个功能,但是遇到一些奇妙的问题,虽然最後有解
但仍觉得怪怪的
问题描述有点长,所以我尽量长话短说。
要做的功能是,能够知道所有 requestMapping 的 URL !!
大致上就是有一个页面可以去 观看哪一个 URL 会对应到 哪个 controller 的哪一个
method
查到的解答如下
http://ppt.cc/LzT4
http://ppt.cc/DQig
问题来了,当我仿照产生一个 controller,启动时却出现错误
错误简单讯息如下
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.
我对於讯息的理解是,从spring的context找不到RequestMappingHandlerMapping 这个
type
於是我又写了一个页面去检查目前spring context所有的 bean
程式码大致如下
https://gist.github.com/frank780117/e65f2b986adc3119a838
所查出来的结果页面图
http://i.imgur.com/PzHuH3v.png
的确是有 RequestMappingHandlerMapping 这一个 bean... class type 也的确是
RequestMappingHandlerMapping.class
比较值得注意的是bean 名称後面有加上 #0
查了一下是说如果 同一个 bean type有多个的话,就会在後面编号 #0 , #1 这样
在其他重复的bean我的确有看到 #0, #1
不过 RequestMappingHandlerMapping 只有 #0 ....? 找不到其他的
RequestMappingHandlerMapping#1 之类的
可能是我的程式码
@Autowire
List<ApplicationContext> appContext;
并不是全部的ApplicationContext ?
回到最原始的问题,为什麽用 @Autowire RequestMappingHandlerMapping 会取不到 ?
我从 context 的却找得到这个 bean, 如果 RequestMappingHandlerMapping 是多个的话
我的 @Autowire List<> 也会失败...
最後功能我是做出来了,不过是从 appContext 自己抓出
RequestMappingHandlerMapping 来做处理
结果图如下
http://i.imgur.com/vAWuAeV.png
不过我还是非常困扰
为什麽 @Autowire 会唯独取不到 RequestMappingHandlerMapping
我取其他的 dependcy 就很正常...
不知道是哪一个观念搞错了...
另外我很确定
@Autowire
List<ApplicationContext> appContext;
并不会得到全部的 Context,至於为什麽我也不晓得
最後其实网路上也有查到相同问题
http://ppt.cc/8uxd
二楼回答,三楼就解了,不过英文太差不了解二楼再说什麽...
感谢大家帮忙了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.218.64.133
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1407836692.A.FEF.html
※ 编辑: cyclone350 (61.218.64.133), 08/12/2014 17:52:07
※ 编辑: cyclone350 (61.218.64.133), 08/12/2014 17:54:34
※ 编辑: cyclone350 (61.218.64.133), 08/12/2014 17:55:41
1F:→ phstudy: 有机会看到servlet-context.xml跟root-context.xml吗? 08/12 18:26
2F:→ ssccg: 大概是RequestMappingHandlerMapping是在servlet-context 08/12 18:30
3F:→ ssccg: 才生出来的,但是你的root-context scan的时候就尝试建立 08/12 18:31
4F:→ ssccg: 你的controller所以找不到? 08/12 18:31
5F:推 yyc1217: 你可以把log level设为info,看看spring在启动时的顺序 08/12 21:04
6F:→ yyc1217: 不过我一直以为ApplicationContext只有一个耶... 08/12 21:04
7F:推 yyc1217: 然後需要你的设定档,不然也只是在这里瞎猜而已 08/12 21:12
感谢提点,因为电脑放在遥远的彼方,隔天才能提供设定档
不过我可以描述设定档是如何设定的
首先如 phstudy 大说的,我的context有两个,
分别为 servlet-context 跟 root-context
servlet-context 主要为 mvc 的设定如
<mvc:annotation-driven />
或
<mvc:view-controller value="/css" />
其中对 controller 取得是用 <bean:component-scan="base-package">
另外 root-context 包含其他所有设定如 dao, service, 连接资料库等等
取得 bean 是用 <bean:component-scan="base-package">
两个 context 用的 component-scan 是同一个 package
(都用根package,因为spring会递回搜寻并创建bean)
p大跟s大讲法我有点头绪了
我一直以为context是没有顺序性的...
我在使用 <import> 之类的设定也没考虑到顺序
以为他分成两个context只是分好玩的 XD
另外一问
我使用 @Autowire List<ApplicationContext>
得到的只有一部分的 context,并非全部
想请问这样的取法有甚麽问题吗?
因为跟网路教学的方式并不一样
google到的方法:
http://ppt.cc/bpCa
最後提一下
今天发问前有试过删除 root-context或servlet-context 的 component-scan
因为有查到说 component-scan两次,会产生两次bean???
不过我从 applicationContext 里面检查却只有产生一个
然後修改结果错误仍一样,不过也可能是我漏掉了甚麽
明天有碰电脑再试试看
※ 编辑: cyclone350 (123.193.192.133), 08/12/2014 22:12:01
8F:推 yyc1217: 这样的话就是第一次scan时要exclude @Controller 08/12 22:54
9F:→ yyc1217: 第二次再针对base-package=你的controller package 08/12 22:55
10F:推 yyc1217: 或是include @Controller 08/12 23:30
11F:→ yyc1217: 印象中spring好像是先找bean,才做url mapping 08/12 23:31
12F:→ yyc1217: 所以autowired的当下才没有东西,但启动後却在context有 08/12 23:35
已经解了
的确是 root-context 跟 servlet-context 顺序问题
我在 root-context scan exclude @Controller
servlet-context scan include @Controller
启动时就找得到了
感谢大家帮忙
※ 编辑: cyclone350 (61.218.64.133), 08/13/2014 09:39:19