2

I have expanda.js. I am calling this dao in my formcontroller.java file but I get the following error.

I guess I need to define DAO as a bean. How can I do this in the SpringWebConfig.java file?

I do not have much control over spring, sorry

Console Error:

SEVERE: Allocate exception for servlet [dispatcher] org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.esma.dao.ExpDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1777) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1333) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:578) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1134) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:777) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:830)

ExpDao.java

package com.esma.dao;

import java.sql.ResultSet;    
import java.sql.SQLException;    
import java.util.List;    
import org.springframework.jdbc.core.BeanPropertyRowMapper;    
import org.springframework.jdbc.core.JdbcTemplate;    
import org.springframework.jdbc.core.RowMapper;

import com.esma.model.Expense;    
    
public class ExpDao {    
JdbcTemplate template;    
    
public void setTemplate(JdbcTemplate template) {    
    this.template = template;    
}    
public int save(Expense exp){    
    String sql="insert into Emp99(name,salary,designation) values('"+exp.getExpenseType()+"',"+exp.getQuantity()+","+exp.getPrice()+","+exp.getPaymentDate()+",'"+exp.getNote()+"' )";    
    return template.update(sql);    
}    
       
public List<Expense> getExpenses(){    
    return template.query("select * from expenses",new RowMapper<Expense>(){    
        public Expense mapRow(ResultSet result, int row) throws SQLException {    
            Expense e=new Expense();    
            e.setExpenseType(result.getString(2));    
            e.setQuantity(result.getInt(3));  
            e.setPrice(result.getInt(4));  
            e.setPaymentDate(result.getDate(5));    
            e.setNote(result.getString(6));    

            return e;    
        }    
    });    
}    
}   

SpringRootConfig.js


package com.esma.config;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;


@Configuration
@ComponentScan(basePackages ={"com.esma.dao"})
public class SpringRootConfig {
//TODO: Services, DAO, DataSource, Email Sender or some other business layer beans.
// In production the datasource configuration is done in properties file but for simplicity purpose it is hardcoded here.   
    @Bean
        public BasicDataSource getDataSource(){
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhost:3306/apartmentmanagement");
            ds.setUsername("root");
            ds.setPassword("1234");
            ds.setMaxTotal(2);
            ds.setInitialSize(1);
            ds.setTestOnBorrow(true);
            ds.setValidationQuery("SELECT 1");
            ds.setDefaultAutoCommit(true);
            return ds;
        }
}


SpringWebConfig.js

/**
 * 
 */
package com.esma.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

import com.esma.dao.ExpDao;
import com.esma.model.Expense;

@Configuration
@ComponentScan(basePackages = { "com.esma" })
@EnableWebMvc
public class SpringWebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        System.out.println("Inside Resource Handler");
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");

    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setViewClass(JstlView.class);
        vr.setPrefix("/WEB-INF/view/");
        vr.setSuffix(".jsp");
        return vr;
    }
    
    @Bean 
    public ExpDao expenceDao() {
        ExpDao exp = new ExpDao();
        exp.setTemplate(com.esma.dao.ExpDao.class);
        return exp;
    }
}

FormController.js

package com.esma.controller;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.esma.dao.ExpDao;
import com.esma.model.Expense;

@Controller
public class FormController {

    @Autowired
    ExpDao dao;

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public String form() {
        new ModelAndView("expense", "expenseObject", new Expense());
        return "expenseForm";// JSP form view
    }

    @RequestMapping(value = "/expense/save", method = RequestMethod.POST)
    public String addExpense(@ModelAttribute("expenseObject") Expense expense, ModelMap model) {

        dao.save(expense);

        model.addAttribute("expenseType", expense.getExpenseType());
        model.addAttribute("quantity", expense.getQuantity());
        model.addAttribute("price", expense.getPrice());
        model.addAttribute("paymentDate", expense.getPaymentDate());
        model.addAttribute("note", expense.getNote());

        System.out.println(model.getAttribute("expenseType"));
        System.out.println(model.getAttribute("quantity"));
        System.out.println(model.getAttribute("price"));
        System.out.println(model.getAttribute("paymentDate"));
        System.out.println(model.getAttribute("note"));

        return "result";
    }

    @RequestMapping(value = "/list")
    public String expenseList(Model m) {
        List<Expense> list = dao.getExpenses();
        m.addAttribute("list", list);
        System.out.println("expense");
        return "expenseList";// JSP form view
    }
}

Esma Haber
  • 23
  • 4

1 Answers1

1

Hello Esma and welcome to stackoverflow.

Since you declared explecitely your bean of type ExpDao with @Bean annotation in the SpringWebConfig.js, The bean registred in the spring context is expenceDao which is the same method name in this code section:

 @Bean 
public ExpDao expenceDao() {
    ExpDao exp = new ExpDao();
    exp.setTemplate(com.esma.dao.ExpDao.class);
    return exp;
}

So Spring container will create and register a bean of type ExpDao with name (or id ) expenceDao (which is the name of the method expenceDao()

and then you ask spring with this section of code to inject a bean with name expDao which is not found.

    @Controller
    public class FormController {

     @Autowired
     ExpDao dao;
    // the rest of the code 
    }

So spring will return a NoSuchBeanDefinitionException because it didn't found a bean with name expDao.

In order to work, you can just change the method name expenceDao() to expDao() in SpringWebConfig.java file in order that spring create the bean with name expDao and not expenceDao.

Thanks.

Abenamor
  • 278
  • 1
  • 4
  • 15