0
votes

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDao': Unsatisfied dependency expressed through method 'setJdbcTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

   **userController code**

        @Controller
        @RequestMapping("user")
        public class UserController {

        private UserService userService;

        @Autowired
        public void setUserService(UserService userService) {
            this.userService = userService;
        }



        //======== code for user data insert =============
        @GetMapping("/createuser")
        public String showUserform(Model theModel) {
            theModel.addAttribute("user", new User());
            return "userform";
        }

        //@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
        @PostMapping("/saveuser")
        public String saveUser(@ModelAttribute("user") @Valid User user,BindingResult result) {

            if (result.hasErrors()) {
                return "userform";
            }

            user.setAuthority("ROLE_USER");
            user.setEnabled(true);

        return "usercreatesuccess";

        }
   **userservice code**

        @Service("userService")
        public class UserService {

        private UserDao userDao;

        @Autowired
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;`enter code here`
        }



        //======== code for user data insert =============
        public void saveUser(User user) {
            userDao.saveUser(user);
        }



        public boolean exists(String username) {
            return userDao.exists(username);
        }

   **userDao code**


         @Component("userDao")
         public class UserDao {

        private NamedParameterJdbcTemplate jdbcTemplate;

        /*
         * @Autowired private PasswordEncoder passwordEncoder;
         */

        @Autowired
        public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }





         //======== query for user data insert =============
         public boolean saveUser(User user) {

         MapSqlParameterSource params = new MapSqlParameterSource();

            params.addValue("username", user.getUsername());
            params.addValue("password", user.getPassword());
            params.addValue("firstname", user.getFirstname());
            params.addValue("lastname", user.getLastname());
            params.addValue("email", user.getEmail());
            params.addValue("enabled", user.isEnabled());
            params.addValue("authority", user.getAuthority());

            jdbcTemplate.update("insert into users ( username, firstname, lastname, password, email, enabled) values ( :username, :firstname, :lastname, :password, :email, :enabled)", params);
            return jdbcTemplate.update("insert into authorities (username, authority) values (:username, :authority)", params) == 1;

        }

        // query for Duplicate username
        public boolean exists(String username) {
            return jdbcTemplate.queryForObject("select count(*) from users where username=:username", new MapSqlParameterSource("username", username), Integer.class) > 0;
        }
   **[blog-servlet.xml][1]**
        <!-- Add support for component scanning -->
        <context:component-scan base-package="com.spring.mvc.blog.xml" />


        <!-- Add support for conversion, formatting and validation support -->
        <mvc:annotation-driven/>

        <!-- Define Spring MVC view resolver -->
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="jspViewResolver">
            <property name="prefix" value="/WEB-INF/view/" />
            <property name="suffix" value=".jsp" />
        </bean>

        <!-- Add support for reading web resources: css, images, js, etc ... -->
        <mvc:resources location="/resources/" mapping="/resources/**"></mvc:resources>

        <!-- connection for datasource -->
        <jee:jndi-lookup jndi-name="jdbc/spring" id="dataSource"
            expected-type="javax.sql.DataSource">
        </jee:jndi-lookup>

   **error** 

      [1]: https://i.stack.imgur.com/WZWVj.png
2
i do not understandmithu sarker

2 Answers

1
votes

ApplicationContext can't initialize userDao bean.

UserDao has a dependency on NamedParameterJdbcTemplate

(Unsatisfied dependency expressed through method 'setJdbcTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate)

You should create a bean of type NamedParameterJdbcTemplate in Xml or Java config.

@Bean 
public NamedParameterJdbcTemplate namedParameterJdbcTemplate (DataSource datasource){
     return new NamedParameterJdbcTemplate(dataSource);
}

Xml :

<bean id="namedParameterJdbcTemplate"  class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"/>
</bean>
2
votes

You will need to define a bean of JdbcTemplate

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
   return new JdbcTemplate(dataSource);
}

You also need DataSource bean that will be injected in jdbcTemplate bean:

@Bean
public DataSource datasource() {
    DataSource ds = new DataSource();
    ds.setDriverClassName(hostdb_driver);
    ds.setUrl(hostdb_url);
    ds.setUsername(hostdb_user);
    ds.setPassword(hostdb_pass);
    return ds;
}

If you are not using Java configuration, here is the XML configuration:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>

To register datasource that is to be injected in jdbctemplate bean, you will need to lookup details for specific database that you are using. For example, MYSQL vs Oracle SQL will have slight changes.

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/databasename" />
    <property name="username" value="root" />
    <property name="password" value="password" />
</bean>

driverClassName and url value will differ for different types of database.