java - 尽管组件扫描是正确的,但无法 Autowiring 字段

标签 java spring spring-mvc

我不断收到此错误,但不明白原因。是的,我知道很多人都有类似的问题,但阅读他们得到的答案并不能解决我的问题。

Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationContextConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mvc.dao.UserInfoDao com.mvc.config.ApplicationContextConfig.userInfoDAO; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mvc.dao.UserInfoDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

com.mvc.controller.MainController:

@Controller
public class MainController {
    @RequestMapping(value = { "/", "/welcome" }, method = RequestMethod.GET)
    public String welcomePage(Model model) {
        model.addAttribute("title", "Welcome");
        model.addAttribute("message", "This is welcome page!");
        return "welcomePage";
    }

@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String adminPage(Model model) {
    return "adminPage";
}

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage(Model model) {

    return "loginPage";
}

@RequestMapping(value = "/logoutSuccessful", method = RequestMethod.GET)
public String logoutSuccessfulPage(Model model) {
    model.addAttribute("title", "Logout");
    return "logoutSuccessfulPage";
}

@RequestMapping(value = "/userInfo", method = RequestMethod.GET)
public String userInfo(Model model, Principal principal) {

    // Sau khi user login thanh cong se co principal
    String userName = principal.getName();

    System.out.println("User Name: " + userName);

    return "userInfoPage";
}

@RequestMapping(value = "/403", method = RequestMethod.GET)
public String accessDenied(Model model, Principal principal) {

    if (principal != null) {
        model.addAttribute("message",
                "Hi " + principal.getName() + "<br> You do not have permission to access this page!");
    } else {
        model.addAttribute("msg", "You do not have permission to access this page!");
    }
    return "403Page";
}
}

com.mvc.dao.UserInfoDao:

public interface UserInfoDao {
public UserInfo findUserInfo(String userName);

// [USER,AMIN,..]
public List<String> getUserRoles(String userName);
}

com.mvc.dao.impl.UserInfoDaoImpl:

public class UserInfoDaoImpl extends JdbcDaoSupport implements UserInfoDao {
@Autowired
public UserInfoDaoImpl(DataSource dataSource) {
    // TODO Auto-generated constructor stub
    this.setDataSource(dataSource);
}

@Override
public UserInfo findUserInfo(String userName) {
    // TODO Auto-generated method stub
    String sql = "Select u.Username,u.Password "//
            + " from Users u where u.Username = ? ";

    Object[] params = new Object[] { userName };
    UserInfoMapper mapper = new UserInfoMapper();
    try {
        UserInfo userInfo = this.getJdbcTemplate().queryForObject(sql, params, mapper);
        return userInfo;
    } catch (EmptyResultDataAccessException e) {
        return null;
    }
}

@Override
public List<String> getUserRoles(String userName) {
    // TODO Auto-generated method stub
    String sql = "Select r.User_Role "//
            + " from User_Roles r where r.Username = ? ";

    Object[] params = new Object[] { userName };

    List<String> roles = this.getJdbcTemplate().queryForList(sql, params, String.class);

    return roles;
}

}

com.mvc.config.ApplicationContextConfig

@Configuration
@ComponentScan("com.mvc.*")

@PropertySource("classpath:datasource-cfg.properties")
public class ApplicationContextConfig {
    @Autowired
    private Environment env;

@Autowired
private UserInfoDao userInfoDAO;

@Bean
public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource rb = new ResourceBundleMessageSource();
    // Load property in message/validator.properties
    rb.setBasenames(new String[] { "messages/validator" });
    return rb;
}

@Bean(name = "viewResolver")
public InternalResourceViewResolver getViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/pages/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

@Bean(name = "dataSource")
public DataSource getDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    // Xem: datasouce-cfg.properties
    dataSource.setDriverClassName(env.getProperty("ds.database-driver"));
    dataSource.setUrl(env.getProperty("ds.url"));
    dataSource.setUsername(env.getProperty("ds.username"));
    dataSource.setPassword(env.getProperty("ds.password"));

    System.out.println("## getDataSource: " + dataSource);

    return dataSource;
}

// Transaction Manager
@Autowired
@Bean(name = "transactionManager")
public DataSourceTransactionManager getTransactionManager(DataSource dataSource) {
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);

    return transactionManager;
}
}

最佳答案

尝试使用 Spring @Service 注释来注释 UserInfoDaoImpl 类。 这告诉 spring 该接口(interface)有一个可以正确注入(inject)的实现。

参见:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/stereotype/Service.html

关于java - 尽管组件扫描是正确的,但无法 Autowiring 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61462488/

相关文章:

java - 如何设置Jbutton的颜色

java - 每个添加的 DAO 接口(interface)都以指数方式增加启动时间(Spring 初始化)

java - Spring MVC 请求和响应流程详解

java - 类的构造函数参数是否也应该使用 Java Bean Validation API 注释进行注释?

java - 如何向 Spring MVC Controller 方法添加自定义安全注释

html - Thymeleaf: th: 在下拉列表中选择

java - java将每条记录存储到json数组

java - 是否有用于 APT 的 Java 库?

arrays - 使用 Spring MVC 从 Jquery ajax 方法返回字符串数组

java - 将关闭信号发送到Java中的另一个线程