Org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean-компонента с именем 'loginController'

Я новичок в Spring, и я пытаюсь создать приложение для обучения, но у меня возникают проблемы с Autowiring, я добавляю свой код. Я работаю над весенним ботинком.

логинконтроллер:

            package com.cloudnexus.spring.controller;

            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;

            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Controller;
            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.cloudnexus.spring.model.Login;
            import com.cloudnexus.spring.model.User;
            import com.cloudnexus.spring.service.UserService;

            @Controller
            public class LoginController {
                @Autowired
                  UserService userService;

                @RequestMapping(value = "/loginProcess", method = RequestMethod.POST)
                  public ModelAndView loginProcess(HttpServletRequest request, HttpServletResponse response,
                  @ModelAttribute("login") Login login) {
                    ModelAndView mav = null;
                    User user = userService.validateUser(login);
                    if (null != user) {
                    mav = new ModelAndView("welcome");
                    mav.addObject("firstname", user.getUsername());
                    } else {
                    mav = new ModelAndView("login");
                    mav.addObject("message", "Username or Password is wrong!!");
                    }
                    return mav;
                  }

            }

            ////

Логин POJO:

        package com.cloudnexus.spring.model;

        public class Login {

            private String username;
            private String password;
            public String getUsername() {
                return username;
            }
            public void setUsername(String username) {
                this.username = username;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }



        }

Пользователь Pojo:

        package com.cloudnexus.spring.model;

        public class User {

            private String username;
            private String password;
            private int IsActive;
            public String getUsername() {
                return username;
            }
            public void setUsername(String username) {
                this.username = username;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            public int getIsActive() {
                return IsActive;
            }
            public void setIsActive(int isActive) {
                IsActive = isActive;
            }

        }

UserDao:

    package com.cloudnexus.spring.dao;

    import com.cloudnexus.spring.model.Login;
    import com.cloudnexus.spring.model.User;

    public interface UserDao {
        User validateUser(Login login);

    }

UserDaoImpl

    package com.cloudnexus.spring.dao;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;

    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;

    import javax.sql.DataSource;
    import com.cloudnexus.spring.model.Login;
    import com.cloudnexus.spring.model.User;

    public class UserDaoImpl implements UserDao{


        @Autowired
          DataSource datasource;
          @Autowired
          JdbcTemplate jdbcTemplate;
        public User validateUser(Login login) {
            String sql = "select * from users where username='" + login.getUsername() + "' and password='" + login.getPassword()
            + "'";
            List<User> users = jdbcTemplate.query(sql, new UserMapper());
            return users.size() > 0 ? users.get(0) : null;
        }

    }


    class UserMapper implements RowMapper<User> {
          public User mapRow(ResultSet rs, int arg1) throws SQLException {
            User user = new User();
            user.setUsername(rs.getString("Name"));
            user.setPassword(rs.getString("Password"));
            user.setIsActive(rs.getInt("IsActive"));

            return user;
          }
        }

UserService:

    package com.cloudnexus.spring.service;

    import com.cloudnexus.spring.model.Login;
    import com.cloudnexus.spring.model.User;

    public interface UserService {
        User validateUser(Login login);

    }

UserServiceImpl

    package com.cloudnexus.spring.service;

    import org.springframework.beans.factory.annotation.Autowired;

    import com.cloudnexus.spring.dao.UserDao;
    import com.cloudnexus.spring.model.Login;
    import com.cloudnexus.spring.model.User;

    public class UserServiceImpl implements UserService{
         @Autowired
          public UserDao userDao;
        public User validateUser(Login login) {
            return userDao.validateUser(login);
        }

    }

файл конфигурации Spring bean:

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

     <context:component-scan base-package = "com.cloudnexus.spring" />
        <context:annotation-config />
        <bean id = "userService" class = "com.cloudnexus.spring.service.UserServiceImpl">
            <property name = "userService" ref = "userService"></property>
        </bean>

        <bean name = "userDao" class = "com.cloudnexus.spring.dao.UserDaoImpl">
            <property name = "dataSource" ref = "dataSource"></property>
        </bean>

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

        <bean id = "dataSource"
            class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name = "driverClassName" value = "com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            <property name = "url" value = ";DatabaseName = " />
            <property name = "username" value = "" />
            <property name = "password" value = "" />
        </bean>

    </beans>
  1. @Autowired к LoginBean loginBean;
  2. Создал геттер-сеттер LoginBean в классе Controller и автоматические сеттеры;
  3. Создан конструктор контроллера и автоматически подключен, как указано в приведенном выше коде;

    Ниже я получаю сообщение об ошибке:

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginController': Unsatisfied dependency expressed through field 'userService': Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao': Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userDao': Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in ServletContext resource [/WEB-INF/springBeanConfiguration.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [com.cloudnexus.spring.dao.UserDaoImpl]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    

    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:569) org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:88) org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:349) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1214) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:543) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:482) org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:306) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302) org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:776) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:861) org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:541) org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext (FrameworkServlet.java:668) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:634) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:682) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext (FrameworkServlet.java:553) org.springframework.web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.java:494) org.springframework.web.servlet.HttpServletBean.init (HttpServletBean.java:136) javax.servlet.GenericServlet.init (GenericServlet.java:160) org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java:953) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:408) org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1041) org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:603) org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.java:312) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) java.lang.Thread.run (Thread.java:748)

пожалуйста, помогите мне, я не могу найти ошибку там, где я сделал не так

Pandian K 06.12.2018 10:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
2 160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш bean-компонент jdbcTemplate ожидает bean-компонент с именем datasource, как вы установили здесь (в части ref=...:

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

Но вашего bean-компонента datasource не существует. Причина в том, что вы определили его как dataSource (обратите внимание на заглавную букву "S") в bean id = "dataSource".

  <bean id = "dataSource"
        class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name = "driverClassName" value = "com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name = "url" value = ";DatabaseName = " />
        <property name = "username" value = "" />
        <property name = "password" value = "" />
    </bean>

Так что измените это на "источник данных", например bean id = "datasource" или измените ссылку в вашем jdbcTemplate на ref = "dataSource"

Также <property name = "url" value = ";DatabaseName = " /> выглядит некорректно, я думаю, вы пропустили правильный value здесь, ";DatabaseName = " выглядит неправильно или неполным.

ОБНОВИТЬ

Поскольку вы используете конфигурацию xml spring, аннотация @Autowired в ваших классах UserDaoImpl и UserServiceImpl не нужна. Однако конфигурация xml требует наличия эквивалентных геттеров / сеттеров. Так что измените свой код как:

В вашем UserDaoImpl вам вообще не нужен компонент dataSource, поэтому мы его удаляем.

public class UserDaoImpl implements UserDao{

    JdbcTemplate jdbcTemplate;

    public User validateUser(Login login) {
        String sql = "select * from users where username='" + login.getUsername() + "' and password='" + login.getPassword()
                + "'";
        List<User> users = jdbcTemplate.query(sql, new UserMapper());
        return users.size() > 0 ? users.get(0) : null;
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}

Однако вам нужен bean-компонент jdbcTemplate, и в вашем определении xml вы его не устанавливаете, поэтому обновите также свой весенний xml-файл, чтобы:

<bean name = "userDao" class = "com.cloudnexus.spring.dao.UserDaoImpl">
        <property name = "jdbcTemplate" ref = "jdbcTemplate"></property>
</bean>

и

public class UserServiceImpl implements UserService{

    private UserDao userDao;

    public User validateUser(Login login) {
        return userDao.validateUser(login);
    }

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

Также у вас есть еще одна ошибка в файле конфигурации spring xml. В определении bean-компонента userService вы снова устанавливаете его как свойство:

<property name = "userService" ref = "userService"></property>

Это неправильно, вы должны установить туда userDao. Обновите его как:

<bean id = "userService" class = "com.cloudnexus.spring.service.UserServiceImpl">
        <property name = "userDao" ref = "userDao"></property>
 </bean>

Я снова изменил идентификатор bean-компонента as = "datasource". Я получаю сообщение об ошибке при создании bean-компонента userservice.

Pandian K 06.12.2018 10:37

...который? Пожалуйста, опубликуйте ошибку stacktrace. Вы исправили <property name = "url" value = ";DatabaseName = " />?

pleft 06.12.2018 10:41

При вводе значения URL была ошибка, я опубликовал сообщение об ошибке, пожалуйста, проверьте и помогите мне

Pandian K 06.12.2018 10:46

Если вы, как и вы, используете конфигурацию xml, вам не следует использовать аннотации, такие как @Autowired, это уже сделано в файле конфигурации spring. Однако вы должны создавать геттеры и сеттеры для своих свойств, я обновлю свой ответ, чтобы показать вам

pleft 06.12.2018 10:48

Скажите, пожалуйста, как вы переименовали bean-компонент источника данных? с "S" или "s"? Это имеет значение для геттеров / сеттеров.

pleft 06.12.2018 10:52

я изменил ссылку как = "dataSource"

Pandian K 06.12.2018 10:54

Небольшой совет - выбрать либо конфигурацию spring xml, либо конфигурацию java с аннотациями. Использование обоих сбивает с толку.

pleft 06.12.2018 11:16

Другие вопросы по теме