已经有映射的bean方法 [英] There is already bean method mapped

查看:94
本文介绍了已经有映射的bean方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到以下异常:

</pre></p><p><b>root cause</b> <pre>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 'sdtm-controller' bean method 
public java.util.List&lt;java.lang.String&gt; com.sas.hls.clc.clinicalstandards.sdtm.SDTM_Controller.getVersions()
to {[/getVersions],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: 
There is already 'SDTM_Controller' bean method
public java.util.List&lt;java.lang.String&gt; com.sas.hls.clc.clinicalstandards.sdtm.SDTM_Controller.getVersions() mapped.
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
    javax.servlet.GenericServlet.init(GenericServlet.java:212)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Thread.java:662)
</pre></p><p><b>root cause</b> <pre>java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'sdtm-controller' bean method 
public java.util.List&lt;java.lang.String&gt; com.sas.hls.clc.clinicalstandards.sdtm.SDTM_Controller.getVersions()
to {[/getVersions],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'SDTM_Controller' bean method
public java.util.List&lt;java.lang.String&gt; com.sas.hls.clc.clinicalstandards.sdtm.SDTM_Controller.getVersions() mapped.

我的控制器类只有一个名为getVersions()的方法.当我在Controller上使用AutoWired时,我的应用程序运行良好,并且没有显式地将任何bean连接在一起.但是后来我转向定义一些bean,以便可以插入其他人在项目中编写的bean.我开始收到重复的bean异常,因此我注释掉了@Autowired注释.我为什么得到这个.我的部署环境中是否仍存在自动布线的残留物??

My controller class only has a single method called getVersions(). My application was working fine when I was using AutoWired on my Controller and did not explicit wire together any beans. But then I switched to defining some beans so that I could hook into beans written by others on the project. I started getting duplicate beans exceptions, so I commented out the @Autowired annotation. Why am I getting this. Are there remnants of the autowiring still in my deployed environment???

@Controller
public class SDTM_Controller {
    private SDTM_Service service;

//  @Autowired
    public SDTM_Controller(SDTM_Service service){
        this.service = service;
    }

    public SDTM_Controller(){

    }

    public void setSDTM_Service(SDTM_Service service){
        this.service = service;
    }

    // URL: sdtm/getVersions

    @RequestMapping(value="/getVersions", method=RequestMethod.GET)
    public @ResponseBody List<String> getVersions(){
        return service.getVersions();
    }

我的web.xml包含以下内容:

My web.xml includes the following:

<servlet>
    <servlet-name>sdtm</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/sdtm-servlet.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>sdtm</servlet-name>
    <url-pattern>/sdtm/*</url-pattern>
</servlet-mapping>

我有一个名为sdtm-servlet.xml的文件,其中包括以下内容:

I have a file named sdtm-servlet.xml that includes the following:

    <context:component-scan base-package="com.sas.hls.clc.clinicalstandards.sdtm" />    
<mvc:annotation-driven/>

    <bean id="sdtm-controller" class="com.sas.hls.clc.clinicalstandards.sdtm.SDTM_Controller" >    
            <property name="SDTM_Service" ref="SDTM_Service" />  
    </bean>

最后,我有一个定义服务的services-config.xml文件.

Lastly, I have a services-config.xml file that defines a service.

   <bean id="sdtmService" class="com.sas.hls.clc.clinicalstandards.sdtm.SDTM_ServiceImpl" >
        <property name="clinicalStandardsInterface" ref="clinicalStandardsInterface" />
   </bean>

推荐答案

您的<mvc:annotation-driven/>标记告诉spring遍历您的类以查找注释并创建带注释的类的实例.您的<bean id="sdtm-controller .../>还将创建控制器的实例.因此,第二个创建的程序会出错,因为已经创建了一个.正如M. Deinum指出的那样,您只需要其中之一,并且由于您正在使用批注,因此只需删除bean配置即可.

Your <mvc:annotation-driven/> tag tells spring to go through your classes looking for annotations and create instances of the annotated classes. Your <bean id="sdtm-controller .../> also creates an instance of your controller. So the second one created is giving an error because one has already been created. As M. Deinum indicated, you only need one of them, and since you are using annotations, simply remove the bean configuration.

这篇关于已经有映射的bean方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆