如何优先考虑具有相同id的spring bean?

时间:2017-02-04 09:35:13

标签: java spring unit-testing spring-mvc junit4

在我们的项目中,我们使用spring Junit进行Junit测试。我们使用@ContextConfiguration注释来加载多个文件。我们有两个类AbstractContextJUnitTestContextJUnitTest以及ContextJUnitTest扩展AbstractContextJUnitTest

在代码流程中,我注意到具有不同bean类型的多个文件中的相同bean ID 。当我测试这些Junits并得到以下错误时。

错误:

  

org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean   命名为'voterId'的类型为[com.spring.test2.Student]   但实际上是[com.spring.test2.Parent]类型

我的要求是学生bean应该使用VoterId而不是Parent Bean加载。

以下是java文件和spring bean xml文件:

的test.xml:

<beans> 
    <context:annotation-config/>
    <bean id="voterId" class="com.spring.test2.Parent">
    <property name="Name" value="hai"/>
    </bean>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
        <property name="username" value="system" />
        <property name="password" value="system" />
    </bean> 
    <bean id="transactionManager"

        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource" />
    </bean> 
</beans>

test1.xml

<beans>

    <context:annotation-config/>
    <bean id="voterId" class="com.spring.test2.Student">
        <property name="name" value="hello"/>
        <property name="number" value="2080"/>
     </bean>
</beans>

AbstractContextJUnitTest.java

@ContextConfiguration(locations="classpath:/com/spring/test2/test1.xml")
public class AbstractContextJUnitTest extends AbstractTransactionalJUnit4SpringContextTests{


}

ContextJUnitTest.java

@ContextConfiguration(locations={"classpath:/com/spring/test2/test.xml"})
public class ContextJUnitTest extends AbstractContextJUnitTest{


    @Test
    public void testStudent(){
        Student stud=applicationContext.getBean("voterId",Student.class);
        assertEquals(stud.getNumber(), 2080);
    }
}

2 个答案:

答案 0 :(得分:3)

你试过@Primary吗?

<bean id="voterId" class="com.spring.test2.Student" primary="true">
        <property name="name" value="hello"/>
        <property name="number" value="2080"/>
</bean>

您必须在com.spring.test2.Parent applicationContext.getBeansOfType(Student.class).get("voterI‌​d") 使用key in some_dict

或者您可以获取类型为:

的bean
key in some_dict.keys()

答案 1 :(得分:1)

这可能是因为你按照那个顺序扩展了类。而你的test.xml没有任何带有Student的bean。所以它只是遵循继承并找到了父。 下面的行使它首先在test.xml中查找bean voterid并在那里找到它。 ContextConfiguration(locations = {“classpath:/com/spring/test2/test.xml”})公共类ContextJUnitTest