【问题标题】:Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService创建名为“userController”的 bean 时出错:通过字段“userService”表达的不满足的依赖关系
【发布时间】:2019-08-07 13:37:36
【问题描述】:

警告:上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“userController”的bean时出错:通过字段“userService”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“userService”的 bean 时出错:通过字段“userDao”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为 'userDao' 的 bean 时出错:通过方法 'setJdbcTemplate' 参数 0 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{}

   **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

【问题讨论】:

  • 我不明白

标签: java xml spring model-view-controller


【解决方案1】:

ApplicationContext 无法初始化 userDao bean。

UserDao 依赖于NamedParameterJdbcTemplate

(通过方法'setJdbcTemplate'参数0表示的不满足的依赖关系;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有'org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate类型的合格bean)

您应该在 Xml 或 Java 配置中创建一个 NamedParameterJdbcTemplate 类型的 bean。

@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】:

    你需要定义一个 JdbcTemplate 的 bean

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

    您还需要将在 jdbcTemplate bean 中注入的 DataSource 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;
    }
    

    如果你没有使用 Java 配置,这里是 XML 配置:

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

    要注册要注入 jdbctemplate bean 的数据源,您需要查找正在使用的特定数据库的详细信息。例如,MYSQL vs Oracle SQL 会有细微的变化。

    <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 和 url 值对于不同类型的数据库会有所不同。

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2019-05-28
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多