有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组织。springframework。豆。工厂UnsatifiedPendencyException:创建名为“loginController”的bean时出错

我是Spring的新手,我正在尝试制作一个学习应用程序,但我在自动布线方面遇到了问题,我正在添加代码。我正在做弹簧靴

登录控制器:

            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;
          }
        }

用户服务:

    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);
        }

    }

Springbean配置文件:

    <?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. @自动连接到LoginBean LoginBean
  2. 在控制器类和自动连线设置器中创建LoginBean的getter设置器
  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?
    

    组织。springframework。豆。工厂注释。AutoWiredNotationBeanPostProcessor$AutoWiredFeldElement。注入(AutoWiredNotationBeanpostProcessor.java:569) 组织。springframework。豆。工厂注释。注入元数据。inject(InjectionMetadata.java:88) 组织。springframework。豆。工厂注释。AutoWiredNotationBeanPostProcessor。后处理属性值(AutoWiredNotationBeanpostProcessor.java:349) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。populateBean(AbstractAutowireCapableBeanFactory.java:1214) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 组织。springframework。豆。工厂支持AbstractAutoWireAbleBeanFactory。createBean(AbstractAutowireCapableBeanFactory.java:482) 组织。springframework。豆。工厂支持AbstractBeanFactory 1美元。getObject(AbstractBeanFactory.java:306) 组织。springframework。豆。工厂支持DefaultSingletonBeanRegistry。getSingleton(DefaultSingletonBeanRegistry.java:230) 组织。springframework。豆。工厂支持抽象工厂。doGetBean(AbstractBeanFactory.java:302) 组织。springframework。豆。工厂支持抽象工厂。getBean(AbstractBeanFactory.java:197) 组织。springframework。豆。工厂支持DefaultListableBeanFactory。预实例化单例(DefaultListableBeanFactory.java:776) 组织。springframework。上下文支持AbstractApplicationContext。finishBeanFactoryInitialization(AbstractApplicationContext.java:861) 组织。springframework。上下文支持AbstractApplicationContext。刷新(AbstractApplicationContext.java:541) 组织。springframework。网状物servlet。FrameworkServlet。configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) 组织。springframework。网状物servlet。FrameworkServlet。createWebApplicationContext(FrameworkServlet.java:634) 组织。springframework。网状物servlet。FrameworkServlet。createWebApplicationContext(FrameworkServlet.java:682) 组织。springframework。网状物servlet。FrameworkServlet。initWebApplicationContext(FrameworkServlet.java:553) 组织。springframework。网状物servlet。FrameworkServlet。initServletBean(FrameworkServlet.java:494) 组织。springframework。网状物servlet。HttpServletBean。init(HttpServletBean.java:136) javax。servlet。通用服务。init(GenericServlet.java:160) 组织。阿帕奇。卡塔琳娜。验证者。AuthenticatorBase。调用(AuthenticatorBase.java:502) 组织。阿帕奇。卡塔琳娜。阀门。打开阀门。调用(ErrorReportValve.java:100) 组织。阿帕奇。卡塔琳娜。阀门。检修阀。调用(AccessLogValve.java:953) 组织。阿帕奇。卡塔琳娜。连接器。郊狼适应者。服务(CoyoteAdapter.java:408) 组织。阿帕奇。郊狼。http11。抽象Http11处理器。进程(AbstractHttp11Processor.java:1041) 组织。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。流程(AbstractProtocol.java:603) 组织。阿帕奇。公猫util。网JIoEndpoint$SocketProcessor。run(JIoEndpoint.java:312) JAVAutil。同时发生的线程池执行器。runWorker(ThreadPoolExecutor.java:1149) JAVAutil。同时发生的ThreadPoolExecutor$Worker。run(ThreadPoolExecutor.java:624) JAVA朗。丝线。运行(Thread.java:748)


共 (1) 个答案

  1. # 1 楼答案

    你的jdbcTemplatebean需要一个名为datasource的bean,就像你在这里设置的那样(在ref=...部分:

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

    但是你的datasourcebean不存在。原因是您在bean id="dataSource"中将其定义为dataSource(注意大写字母“S”)

      <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配置,所以UserDaoImplUserServiceImpl类中的@Autowired注释是不必要的。然而,xml配置要求存在等效的getter/setter。因此,将代码更改为:

    UserDaoImpl中,您根本不需要dataSourcebean,因此我们正在删除它

    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;
        }
    }
    

    但是,您确实需要jdbcTemplatebean,并且在xml定义中没有设置它,所以也要将spring 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配置文件中还有另一个错误。在userServicebean定义中,您再次将其设置为属性:

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

    这是错误的,您应该在那里设置userDao。更新为:

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