Spring MVC - Bean not available with @Autowired

I'm having trouble getting the bean data source defined in an XML file to a class in Spring using @Autowired annotations.

Anyone have an idea what is going on here? It seems that the dataSource in the * Impl class is not connected.

DAO-context.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:8889/spring" /> <property name="username" value="user" /> <property name="password" value="1234" /> </bean> 

PersonDaoImpl.java

 public class PersonDaoImpl implements PersonDao { @Autowired private DataSource dataSource; private JdbcTemplate jdbcTemplate = new JdbcTemplate(); public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { System.out.println("SETTING DATA SOURCE"); this.dataSource = dataSource; } public List<Person> getPersonList() { // TODO Auto-generated method stub return null; } public void savePerson(Person person) { // TODO Auto-generated method stub } public Person getPersonById(int id) { System.out.println("Getting Person: " + id); return null; } @Override public int getPersonCount(){ String sql = "SELCECT COUNT(*) FROM PERSON"; jdbcTemplate.setDataSource(getDataSource()); int count = jdbcTemplate.queryForInt(sql); System.out.println("Count of Person: " + count); return count; } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } 

}

... and finally an exception.

 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: No DataSource specified org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) java.lang.IllegalArgumentException: No DataSource specified org.springframework.util.Assert.notNull(Assert.java:112) org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:97) org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382) org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456) org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464) org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:472) org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:477) org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:486) com.myPackage.rest.dao.impl.PersonDaoImpl.getPersonCount(PersonDaoImpl.java:50) com.myPackage.rest.HomeController.home(HomeController.java:36) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

Any help would be greatly appreciated, greetings.

+4
source share
3 answers

Your data source should be set to JdbcTemplate (I don't see that you are doing this). Also, since you put the @Autowired annotation in a field, I don't think it uses the installer, which is why your setDataSource method is not called. Since your exception indicates that you called jdbcTemplate.execute and dataSource is null, that makes sense.

If you look here: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/jdbc.html , there is an example of auto-sourceing a data source, but the idea is this:

 public class MyDao { private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } } 
+5
source

That's right, thanks to two answers, it works for me.

dao-context (as indicated above, with the addition):

  <bean id="personDao" class="com.mypackage.rest.dao.impl.PersonDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> 

Class Impl

 @Repository public class PersonDaoImpl implements PersonDao { private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public int getPersonCount(){ String sql = "select count(*) from person"; return jdbcTemplate.queryForInt(sql); } } 

Another important part that I skipped is the Injected Impl Dependency Inpled instance in the controller.

 @Controller public class HomeController { @Autowired private PersonDao personDao; @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { int personCount = personDao.getPersonCount(); model.addAttribute("personCount", personCount ); return "home"; } } 
+1
source

The impl class must be marked for processing with spring:

 @Repository public class PersonDaoImpl implements PersonDao { 

Now, if spring packet scanning is used, it will find this class and process all @Autowired annotations

0
source

Source: https://habr.com/ru/post/1446106/


All Articles