Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to give priority to spring bean with same id?

In our project we are using spring with Junit for Junit testing. We have used @ContextConfiguration annotation for loading multiple file. We have two classes AbstractContextJUnitTest and ContextJUnitTest and ContextJUnitTest extends AbstractContextJUnitTest.

During code flow I have noticed that same bean Id in multiple files with different bean types. When I am testing these Junits and getting the below error.

Error:

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'voterId' is expected to be of type [com.spring.test2.Student] but was actually of type [com.spring.test2.Parent]

My requirement is Student bean should load with VoterId instead of Parent Bean.

Below are the java files and spring bean xml files:

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);
    }
}
like image 359
sidhartha pani Avatar asked Sep 01 '25 06:09

sidhartha pani


1 Answers

Did you tried @Primary?

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

You have to use @Qualifier for com.spring.test2.Parent wherever you need.

Or you can get the bean with type as:

applicationContext.getBeansOfType(Student.class).get("voterI‌​d")
like image 119
Arpit Aggarwal Avatar answered Sep 02 '25 20:09

Arpit Aggarwal