JDK版本:1.7(最新更新) 春:3.2.16釋放春:同一類的多個控制器實例
我有一個通用的控制器類,可重複使用的多重功能。由於這些需求的基於註解的方法的侷限性,我正在使用基於XML的配置。另外,我禁用了XML中的組件掃描。
我配置了多個相同類的bean實例,並使用SimpleUrlHandlerMapping
將URL映射到控制器。如果我在一次啓用一個控制器的情況下測試該項目,則工作正常。然而,當啓用所述第二實例,彈簧抱怨有以下錯誤:
ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'deviceController' bean method
public java.lang.String com.smvc.pr05.controllers.SearchController.search(java.util.Locale,org.springframework.ui.ModelMap)
to {[],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'searchController' bean method
public java.lang.String com.smvc.pr05.controllers.SearchController.search(java.util.Locale,org.springframework.ui.ModelMap) mapped.
...
Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'installerController' bean method
public java.lang.String com.smvc.pr05.controllers.SearchController.search(java.util.Locale,org.springframework.ui.ModelMap)
to {[],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'deviceController' bean method
public java.lang.String com.smvc.pr05.controllers.SearchController.search(java.util.Locale,org.springframework.ui.ModelMap) mapped.
...
我與範圍=單和範圍=原型控制器bean定義嘗試過。我嘗試過啓用組件掃描(保留XML中手動定義的bean)並禁用相同的功能。錯誤仍然存在。
雖然這可能是固定的,但如果我爲每個實例創建具體類,我真的想保留它作爲最後一個選項。我對Spring的功能有很強的信念,因爲我對非控制器類使用了類似的技術。
請讓我知道,我錯過了什麼。
彈簧配置(EDITED與控制器單)
...
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<beans:property name="mappings">
<beans:props>
<beans:prop key="/">homeController</beans:prop>
<beans:prop key="/deviceSearch/">deviceController</beans:prop>
<beans:prop key="/installerSearch/">installerController</beans:prop>
<beans:prop key="/customerSearch/">customerController</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
...
<beans:bean id="homeController" class="com.smvc.pr05.controllers.HomeController" >
</beans:bean>
<beans:bean id="deviceController" class="com.smvc.pr05.controllers.SearchController">
<beans:property name="metaModel" ref="deviceModel"/>
<beans:property name="searchService" ref="deviceService" />
</beans:bean>
<beans:bean id="installerController" class="com.smvc.pr05.controllers.SearchController" >
<beans:property name="metaModel" ref="installerModel"/>
<beans:property name="searchService" ref="installerService" />
</beans:bean>
<beans:bean id="customerController" class="com.smvc.pr05.controllers.SearchController" >
<beans:property name="metaModel" ref="customerModel"/>
<beans:property name="searchService" ref="customerService" />
</beans:bean>
Java的控制器類:
...
@Controller
public class SearchController {
private static final Logger LOG = LoggerFactory.getLogger(SearchController.class);
private SearchService searchService; //Has explicit set() method
private MetaModel metaModel; //Has explicit set() method
@SuppressWarnings({ "unchecked" })
@RequestMapping(method = RequestMethod.POST)
public String search(Locale locale, ModelMap modelMap) {
...
}
public void setSearchService(SearchService searchService) {
this.searchService = searchService;
}
public void setMetaModel(MetaModel metaModel) {
this.metaModel = metaModel;
}
}
爲什麼你這樣做?控制器意味着單身。你想要達到什麼目的? –
在上述情況下,請忽略屬性範圍。它被添加用於測試目的。基本上,控制器是單身人士。根據bean定義設置的屬性,我可以使用相同的控制器來服務多個功能。例如,如果設置了「deviceModel」,則控制器將搜索設備。 – ajoshi
你在xml配置中使用' '嗎? –