【问题标题】:Component annotation is not working properly组件注释无法正常工作
【发布时间】:2015-05-31 21:02:49
【问题描述】:

我是 spring 和 hibernate 的新手,一切正常,但只有组件注释不起作用。每次出现此错误时 -

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.vc.teacher.db.dao.UserDao] 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)}

我的代码是 -

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>teacher</display-name>
    <welcome-file-list>
        <welcome-file>jsp/signin.jsp</welcome-file>
    </welcome-file-list>
    <!-- Spring Configuration -->
        <servlet>
            <servlet-name>spring</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
         <servlet-name>default</servlet-name>
         <url-pattern>*.css</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.js</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.jpg</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.woff</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.ttf</url-pattern>
        </servlet-mapping>

     <context-param>
        <param-name>log4jXMLpath</param-name>
        <param-value>/WEB-INF/log4j.xml</param-value>
    </context-param>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>
</web-app>

application-context.xml

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

    <tx:annotation-driven />
    <context:component-scan base-package="com.vc.teacher" />


    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        lazy-init="false">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.vc.teacher.entities.User</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <!-- <prop key="hibernate.current_session_context_class">thread</prop> -->
                <prop key="show_sql">true</prop>
            </props>
        </property>
    </bean>



    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/teacher"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>


</beans>

**春天

-servlet.xml** 

<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" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<context:component-scan base-package="com.vc.teacher.controller" />

<!-- Configuration defining views files -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
</bean>
</beans>

UserDao 类

package com.vc.teacher.db.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.vc.teacher.entities.User;

@Component
public class UserDao {


    @Autowired
    SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Transactional
    public User checkCreditionals(String email, String password){
        User user = null;
        Session session  =  sessionFactory.getCurrentSession();
        Query query =   session.createQuery("from User where email = '"+email+"' and password = '"+password+"'");
        List list   =   query.list();
        if(list.size()>0)
            user =  (User)list.get(0);

        return user;
    }

    @Transactional
    public boolean registerUser(User user){
        boolean result = false;
        Session session = sessionFactory.getCurrentSession();
        try{
            user.setUserTypeId(2);
            session.save(user);

            result = true;
        } catch (Exception e){
            result = false;
            e.printStackTrace();
        }

        return result;
    }

}

实体类 - 用户

package com.vc.teacher.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue
    @Column(name="user_id")
    private int id;
    @Column(name="age")
    private int age;
    @Column(name="user_type_id")
    private int userTypeId;
    @Column(name="first_name")
    private String firstName;
    @Column(name="last_name")
    private String lastName;
    @Column(name="profession")
    private String profession;
    @Column(name="phone")
    private String phone;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="address")
    private String address;
    @Column(name="status")
    private String status;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public int getUserTypeId() {
        return userTypeId;
    }
    public void setUserTypeId(int userTypeId) {
        this.userTypeId = userTypeId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getProfession() {
        return profession;
    }
    public void setProfession(String profession) {
        this.profession = profession;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }

}

控制器类 - AccountController

package com.vc.teacher.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.vc.teacher.db.dao.UserDao;
import com.vc.teacher.entities.User;

@Controller
public class AccountController {

   @Autowired
   UserDao userDao; 

    @RequestMapping("/login")
    public String loginUser(@RequestParam("email") String email,
            @RequestParam("password") String password, Model model) {

        User user = userDao.checkCreditionals(
                email, password);
        if (user != null) {
            model.addAttribute("user", user);
            return "jsp/profile";
        } else {
            model.addAttribute("error", "Wrong creditionals");
            return "jsp/signin";
        }

    }

    @RequestMapping("/signUp")
    public String initilize(Model model) {
        model.addAttribute(new User());
        return "jsp/signup";
    }

    @RequestMapping(method = RequestMethod.POST, value = "/register")
    public String signUpUser(User user, RedirectAttributes attributes) {
        boolean result = false;

        user.setStatus("Deactive");
        result = userDao.registerUser(user);

        if (result == true) {
            attributes.addFlashAttribute("message", "You are ready to go now !");
            return "redirect:/signUp";
        } else {
            attributes.addFlashAttribute("message", "Something went wrong");
            return "redirect:/signUp";
        }

    }
}

【问题讨论】:

  • 您是否已将 ContextLoaderListener 配置为使用 application-context.xml?
  • 能否请您发布您的 web.xml 条目..
  • @sivaprasadreddy.k..是的,我在问题中添加了 web.xml 代码
  • 尝试在您的 application-context.xml 中添加
  • 这是罪魁祸首,当您定义通过 标签加载 dispatter-servlet 时,您的 spring-servlet.xml 将始终优先于 application-context.xml .请从 application-context.xml 中删除以下行并将其添加到 spring-servlet.xml 中,然后一切都应该适合您。

标签: java spring hibernate


【解决方案1】:

你的 spring-servlet.xml 说

<context:component-scan base-package="com.vc.teacher.controller" />

UserDao 组件不在控制器包中。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多