Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring beans created but not autowired

I know there are so many similar questions about this. I looked through a lot of them but the problem still remains.

I have a service that gets created but is not autowired. There is no(!) manual initiation, neither in the project nor in tests (like in this question)

Both beans are found and created, says Tomcat output. At least the first service is not injected where it should be. I don't know about the second one.

Service (Interface):

public interface SchoolService {
  public School getSchool(String id);
}

Service (Implementation):

@Service
@Transactional
public class SchoolServiceImpl implements SchoolService {

  @Autowired
  private SchoolDAO schoolDAO;

  public School getSchool(String id) {
    //database things
    return school;
  }

}

Where it gets "called"

public class SchoolMenu implements Serializable {

  @Autowired
  private SchoolService schoolService;

  public SchoolMenu () {
    //here schoolService is null
    School school = schoolService.getSchool("id");
  }

}

application-context.xml

<?xml version='1.0' encoding='UTF-8' ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">


    <bean id="SchoolServiceImpl" class="content_management.School.service.SchoolServiceImpl"/>
    <bean id="SchoolDAOImpl" class="content_management.School.dao.SchoolDAOImpl"/>
</beans>

Tomcat Output:

org.springframework.beans.factory.support.DefaultListableBeanFactory: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@57003970: defining beans [SchoolServiceImpl,SchoolDAOImpl]; root of factory hierarchy
org.springframework.beans.factory.support.DefaultListableBeanFactory: Creating shared instance of singleton bean 'SchoolServiceImpl'
org.springframework.beans.factory.support.DefaultListableBeanFactory: Creating instance of bean 'SchoolServiceImpl'
org.springframework.beans.factory.support.DefaultListableBeanFactory: Eagerly caching bean 'SchoolServiceImpl' to allow for resolving potential circular references
org.springframework.beans.factory.support.DefaultListableBeanFactory: Finished creating instance of bean 'SchoolServiceImpl'
org.springframework.beans.factory.support.DefaultListableBeanFactory: Creating shared instance of singleton bean 'SchoolDAOImpl'
org.springframework.beans.factory.support.DefaultListableBeanFactory: Creating instance of bean 'SchoolDAOImpl'
org.springframework.beans.factory.support.DefaultListableBeanFactory: Eagerly caching bean 'SchoolDAOImpl' to allow for resolving potential circular references
org.springframework.beans.factory.support.DefaultListableBeanFactory: Finished creating instance of bean 'SchoolDAOImpl'

Where is my error?

like image 810
sebastian Avatar asked Sep 28 '22 05:09

sebastian


1 Answers

In order for @Autowired to work, SchoolMenu also has to be a Spring bean. If it is not, you can get schoolService from application context. Something like this

ApplicationContext appContext = new ClassPathXmlApplicationContext("application-context.xml");
SchoolService schoolService = (SchoolService) appContext.getBean(SchoolService.class);
like image 168
Predrag Maric Avatar answered Nov 04 '22 00:11

Predrag Maric