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配置中使用' '吗? –