2017-12-28 5 views
0

Ich erstelle eine ShoppingCart App mit Spring-mvc.In Dao-Ebene verwende ich Spring-Hibernate ORM-Funktion.org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine berechtigende Bean

@Repository("baseDao") 
public class BaseDaoImpl<T extends ShoppingCartEntity> implements BaseDao<T> 
{ 
    @Autowired 
    protected SessionFactory sessionFactory; 

    private Class<T> entityClass; 

    public BaseDaoImpl(Class<T> entityClass) { 
     super(); 
     this.entityClass = entityClass; 
    } 

    public Serializable save(T entity) { 
     return sessionFactory.getCurrentSession().save(entity); 
    } 


    public void update(T entity) { 
     sessionFactory.getCurrentSession().update(entity); 
    } 


    public void saveOrUpdate(T entity) { 
     sessionFactory.getCurrentSession().saveOrUpdate(entity); 
    } 
} 

CartDaoImpl.java

@Repository("cartDao") 
public class CartDaoImpl extends BaseDaoImpl<CartMaster> implements CartDao { 

    private Class<CartMaster> entityClass; 

    public CartDaoImpl(@Value("com.orgn.shc.entity.CartMaster")Class<CartMaster> entityClass) { 
     super(entityClass); 
     this.entityClass = entityClass; 
    } 
//other getter & setter 
    } 

Ich habe eine Klasse Basisentität namens ShoppingCartEntity.java.

@MappedSuperclass 
public class ShoppingCartEntity implements Serializable { 

    private static final long serialVersionUID = 1L; 
    //other fields 
} 

CartMaster.java:

@Entity 
    @Table(name = "SHOP_CART_MASTER") 
    public class CartMaster extends ShoppingCartEntity { 
    //other fields 
    } 

nun während des Einsatzes der Anwendung in WebLogic erhalte ich folgende Ausnahme:

<28 Dec, 2017, 11:48:08,916 PM IST> <Error> 
    <org.springframework.web.servlet.DispatcherServlet> <BEA-000000> <Context 
    initialization failed 
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
    creating bean with name 'baseDao' defined in URL [zip:C:/Oracle 
    /Middleware/ORACLE_HOME/user_projects/domains/wl_server/servers 
    /AdminServer/tmp/_WL_user/shoppingcart/8i2b70/war/WEB-INF/lib 
    /wl_cls_gen.jar!/com/orgn/shc/dao/impl/BaseDaoImpl.class]: Unsatisfied 
    dependency expressed through constructor parameter 0; nested exception is 
    org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
    qualifying bean of type 'java.lang.Class<?>' available: expected at least 
    1 bean which qualifies as autowire candidate. Dependency annotations: {} 
    at 
org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 

Seine feder bean configuraation Teil, wie unten

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/SHPDS" 
    expected-type="javax.sql.DataSource" /> 

    <bean id="sessionFactory" 
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.orgn.shc.entity" /> 
     <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.jdbc.batch_size">20</prop> 
     </props> 
     </property> 
    </bean> 

    <mvc:annotation-driven /> 
    <context:component-scan base-package="com.orgn.shc" /> 


    <bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/view/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

<mvc:resources mapping="/assets/**" location="/assets/" /> 

Meine Wahrnehmung ist, dass @Value Annotation auf Konstruktor-Ebene ausreicht, um die Abhängigkeiten in Unterklassen entsprechend zu injizieren.

Kann jemand dafür eine passende Lösung haben?

Antwort

0

Entfernen Sie @Repository("baseDao") von Ihrem BaseDaoImpl, da es nicht als separate Bean erstellt werden sollte; Stattdessen sollte es nur als übergeordnetes Element für andere DAO-Klassen verwendet werden. Ich würde es auch abstract und seinen Erbauer protected bilden, um versehentliche Instanziierung zu vermeiden.

Auch sieht es aus wie Sie den Konstruktor Ihrer CartDaoImpl der folgenden ändern müssen:

public CartDaoImpl() { 
    super(CartMaster.class); 
} 

Und ich glaube nicht, dass Sie entityClass Feld tatsächlich benötigen in CartDaoImpl, wie Sie die Klasse Ihres Unternehmens kennen in diesem DAO: es ist CartMaster.class. Zur gleichen Zeit, in BaseDaoImpl, dass entityClass Feld kann nützlich sein, um Elemente aus der Datenbank zu lesen (auch wenn Sie solche Methoden nicht haben).

+0

Ich habe solche methode.Infact verwende ich eine Methode getAll(), die für createCriteria (entityClass) .list() –

+0

verwendet wird, was es abstrakt tat das Treak für me.thanks Roman –

Verwandte Themen